]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pnm] Remove userptr_t from PNM image parsing
authorMichael Brown <mcb30@ipxe.org>
Fri, 25 Apr 2025 16:21:52 +0000 (17:21 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 25 Apr 2025 16:23:37 +0000 (17:23 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/pixbuf.c
src/image/pnm.c
src/include/ipxe/pixbuf.h
src/include/ipxe/pnm.h

index 641a0fb53f096ea00b34d56440023dec3ebbc509..d0b80b2a961ed97709c319563ca959b488a16c33 100644 (file)
@@ -65,7 +65,8 @@ struct pixel_buffer * alloc_pixbuf ( unsigned int width, unsigned int height ) {
        ref_init ( &pixbuf->refcnt, free_pixbuf );
        pixbuf->width = width;
        pixbuf->height = height;
-       pixbuf->len = ( width * height * sizeof ( uint32_t ) );
+       pixbuf->pixels = ( width * height );
+       pixbuf->len = ( pixbuf->pixels * sizeof ( uint32_t ) );
 
        /* Check for multiplication overflow */
        if ( ( width != 0 ) &&
index f24b28841ac6406d39511650fd91828be2db13d8..4b5020b642fed63cd11103d3e74ac189ae870c4d 100644 (file)
@@ -46,21 +46,21 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 static int pnm_ascii ( struct image *image, struct pnm_context *pnm ) {
        char buf[ pnm->ascii_len + 1 /* NUL */ ];
        char *endp;
+       char ch;
        size_t len;
        int value;
        int in_comment = 0;
 
        /* Skip any leading whitespace and comments */
        for ( ; pnm->offset < image->len ; pnm->offset++ ) {
-               copy_from_user ( &buf[0], image->data, pnm->offset,
-                                sizeof ( buf[0] ) );
+               ch = *( ( ( const uint8_t * ) image->data ) + pnm->offset );
                if ( in_comment ) {
-                       if ( buf[0] == '\n' )
+                       if ( ch == '\n' )
                                in_comment = 0;
                } else {
-                       if ( buf[0] == '#' ) {
+                       if ( ch == '#' ) {
                                in_comment = 1;
-                       } else if ( ! isspace ( buf[0] ) ) {
+                       } else if ( ! isspace ( ch ) ) {
                                break;
                        }
                }
@@ -76,7 +76,7 @@ static int pnm_ascii ( struct image *image, struct pnm_context *pnm ) {
        /* Copy ASCII value to buffer and ensure string is NUL-terminated */
        if ( len > ( sizeof ( buf ) - 1 /* NUL */ ) )
                len = ( sizeof ( buf ) - 1 /* NUL */ );
-       copy_from_user ( buf, image->data, pnm->offset, len );
+       memcpy ( buf, ( image->data + pnm->offset ), len );
        buf[len] = '\0';
 
        /* Parse value and update offset */
@@ -104,7 +104,7 @@ static int pnm_ascii ( struct image *image, struct pnm_context *pnm ) {
  * @ret value          Value, or negative error
  */
 static int pnm_binary ( struct image *image, struct pnm_context *pnm ) {
-       uint8_t value;
+       const uint8_t *value;
 
        /* Sanity check */
        if ( pnm->offset == image->len ) {
@@ -114,10 +114,8 @@ static int pnm_binary ( struct image *image, struct pnm_context *pnm ) {
        }
 
        /* Extract value */
-       copy_from_user ( &value, image->data, pnm->offset, sizeof ( value ) );
-       pnm->offset++;
-
-       return value;
+       value = ( image->data + pnm->offset++ );
+       return *value;
 }
 
 /**
@@ -189,15 +187,15 @@ static uint32_t pnm_pixmap ( uint32_t composite, unsigned int index __unused ) {
 static int pnm_data ( struct image *image, struct pnm_context *pnm,
                      struct pixel_buffer *pixbuf ) {
        struct pnm_type *type = pnm->type;
-       size_t offset = 0;
+       unsigned int pixels = pixbuf->pixels;
+       unsigned int index = 0;
        unsigned int xpos = 0;
        int scalar;
        uint32_t composite;
-       uint32_t rgb;
        unsigned int i;
 
        /* Fill pixel buffer */
-       while ( offset < pixbuf->len ) {
+       while ( index < pixels ) {
 
                /* Extract a scaled composite scalar value from the file */
                composite = 0;
@@ -213,15 +211,12 @@ static int pnm_data ( struct image *image, struct pnm_context *pnm,
 
                /* Extract 24-bit RGB values from composite value */
                for ( i = 0 ; i < type->packing ; i++ ) {
-                       if ( offset >= pixbuf->len ) {
+                       if ( index >= pixels ) {
                                DBGC ( image, "PNM %s has too many pixels\n",
                                       image->name );
                                return -EINVAL;
                        }
-                       rgb = type->rgb ( composite, i );
-                       copy_to_user ( pixbuf->data, offset, &rgb,
-                                      sizeof ( rgb ) );
-                       offset += sizeof ( rgb );
+                       pixbuf->data[index++] = type->rgb ( composite, i );
                        if ( ++xpos == pixbuf->width ) {
                                xpos = 0;
                                break;
@@ -287,19 +282,19 @@ static struct pnm_type pnm_types[] = {
  * @ret type           PNM image type, or NULL if not found
  */
 static struct pnm_type * pnm_type ( struct image *image ) {
-       struct pnm_signature signature;
+       const struct pnm_signature *signature;
        struct pnm_type *type;
        unsigned int i;
 
        /* Extract signature */
-       assert ( image->len >= sizeof ( signature ) );
-       copy_from_user ( &signature, image->data, 0, sizeof ( signature ) );
+       assert ( image->len >= sizeof ( *signature ) );
+       signature = image->data;
 
        /* Check for supported types */
        for ( i = 0 ; i < ( sizeof ( pnm_types ) /
                            sizeof ( pnm_types[0] ) ) ; i++ ) {
                type = &pnm_types[i];
-               if ( type->type == signature.type )
+               if ( type->type == signature->type )
                        return type;
        }
        return NULL;
@@ -390,23 +385,23 @@ static int pnm_pixbuf ( struct image *image, struct pixel_buffer **pixbuf ) {
  * @ret rc             Return status code
  */
 static int pnm_probe ( struct image *image ) {
-       struct pnm_signature signature;
+       const struct pnm_signature *signature;
 
        /* Sanity check */
-       if ( image->len < sizeof ( signature ) ) {
+       if ( image->len < sizeof ( *signature ) ) {
                DBGC ( image, "PNM %s is too short\n", image->name );
                return -ENOEXEC;
        }
 
        /* Check signature */
-       copy_from_user ( &signature, image->data, 0, sizeof ( signature ) );
-       if ( ! ( ( signature.magic == PNM_MAGIC ) &&
-                ( isdigit ( signature.type ) ) &&
-                ( isspace ( signature.space ) ) ) ) {
+       signature = image->data;
+       if ( ! ( ( signature->magic == PNM_MAGIC ) &&
+                ( isdigit ( signature->type ) ) &&
+                ( isspace ( signature->space ) ) ) ) {
                DBGC ( image, "PNM %s has invalid signature\n", image->name );
                return -ENOEXEC;
        }
-       DBGC ( image, "PNM %s is type %c\n", image->name, signature.type );
+       DBGC ( image, "PNM %s is type %c\n", image->name, signature->type );
 
        return 0;
 }
index 6c70c1c058ecc2ded0f4876f5d545339a5bf7a40..47ea0065ee5f9fc33e5b9080f50bb1fdaace1e1e 100644 (file)
@@ -22,6 +22,8 @@ struct pixel_buffer {
        unsigned int height;
        /** 32-bit (8:8:8:8) xRGB pixel data, in host-endian order */
        uint32_t *data;
+       /** Total number of pixels */
+       unsigned int pixels;
        /** Total length */
        size_t len;
 };
index 860968cbced992d6683a842a3c9fec13478bb56c..43f52cbdd38873e03f3b189de47d2c4332a0a0a0 100644 (file)
@@ -10,7 +10,6 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <stdint.h>
-#include <ipxe/uaccess.h>
 #include <ipxe/image.h>
 
 /** PNM signature */