[deflate] Remove userptr_t from decompression code

Simplify the deflate, zlib, and gzip decompression code by assuming
that all content is fully accessible via pointer dereferences.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-04-22 12:13:22 +01:00
parent b89a34b07f
commit c059b34170
9 changed files with 153 additions and 154 deletions

View File

@@ -156,19 +156,18 @@ static void deflate_okx ( struct deflate *deflate,
struct deflate_test *test,
struct deflate_test_fragments *frags,
const char *file, unsigned int line ) {
uint8_t data[ test->expected_len ];
struct deflate_chunk in;
struct deflate_chunk out;
size_t frag_len = -1UL;
size_t offset = 0;
uint8_t buf[ test->expected_len ];
const void *data = test->compressed;
size_t remaining = test->compressed_len;
size_t frag_len = -1UL;
struct deflate_chunk out;
unsigned int i;
/* Initialise decompressor */
deflate_init ( deflate, test->format );
/* Initialise output chunk */
deflate_chunk_init ( &out, virt_to_user ( data ), 0, sizeof ( data ) );
deflate_chunk_init ( &out, buf, 0, sizeof ( buf ) );
/* Process input (in fragments, if applicable) */
for ( i = 0 ; i < ( sizeof ( frags->len ) /
@@ -179,16 +178,15 @@ static void deflate_okx ( struct deflate *deflate,
frag_len = frags->len[i];
if ( frag_len > remaining )
frag_len = remaining;
deflate_chunk_init ( &in, virt_to_user ( test->compressed ),
offset, ( offset + frag_len ) );
/* Decompress this fragment */
okx ( deflate_inflate ( deflate, &in, &out ) == 0, file, line );
okx ( in.len == ( offset + frag_len ), file, line );
okx ( in.offset == in.len, file, line );
okx ( deflate_inflate ( deflate, data, frag_len,
&out ) == 0, file, line );
okx ( deflate->in == ( data + frag_len ), file, line );
okx ( deflate->end == ( data + frag_len ), file, line );
/* Move to next fragment */
offset = in.offset;
data += frag_len;
remaining -= frag_len;
if ( ! remaining )
break;
@@ -199,9 +197,13 @@ static void deflate_okx ( struct deflate *deflate,
/* Check decompression has terminated as expected */
okx ( deflate_finished ( deflate ), file, line );
okx ( offset == test->compressed_len, file, line );
okx ( deflate->in == ( test->compressed + test->compressed_len ),
file, line );
okx ( deflate->end == ( test->compressed + test->compressed_len ),
file, line );
okx ( out.offset == test->expected_len, file, line );
okx ( memcmp ( data, test->expected, test->expected_len ) == 0,
okx ( out.data == buf, file, line );
okx ( memcmp ( out.data, test->expected, test->expected_len ) == 0,
file, line );
}
#define deflate_ok( deflate, test, frags ) \

View File

@@ -33,6 +33,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#undef NDEBUG
#include <stdint.h>
#include <string.h>
#include <ipxe/image.h>
#include <ipxe/gzip.h>
#include <ipxe/test.h>
@@ -114,8 +115,7 @@ static void gzip_okx ( struct gzip_test *test, const char *file,
struct image *extracted;
/* Construct compressed image */
image = image_memory ( test->compressed_name,
virt_to_user ( test->compressed ),
image = image_memory ( test->compressed_name, test->compressed,
test->compressed_len );
okx ( image != NULL, file, line );
okx ( image->len == test->compressed_len, file, line );
@@ -128,7 +128,7 @@ static void gzip_okx ( struct gzip_test *test, const char *file,
/* Verify extracted image content */
okx ( extracted->len == test->expected_len, file, line );
okx ( memcmp ( extracted->data, virt_to_user ( test->expected ),
okx ( memcmp ( extracted->data, test->expected,
test->expected_len ) == 0, file, line );
/* Verify extracted image name */

View File

@@ -89,8 +89,7 @@ static void zlib_okx ( struct zlib_test *test, const char *file,
struct image *extracted;
/* Construct compressed image */
image = image_memory ( test->compressed_name,
virt_to_user ( test->compressed ),
image = image_memory ( test->compressed_name, test->compressed,
test->compressed_len );
okx ( image != NULL, file, line );
okx ( image->len == test->compressed_len, file, line );
@@ -103,7 +102,7 @@ static void zlib_okx ( struct zlib_test *test, const char *file,
/* Verify extracted image content */
okx ( extracted->len == test->expected_len, file, line );
okx ( memcmp ( extracted->data, virt_to_user ( test->expected ),
okx ( memcmp ( extracted->data, test->expected,
test->expected_len ) == 0, file, line );
/* Verify extracted image name */