From: Michael Brown Date: Thu, 30 Jul 2026 12:25:58 +0000 (+0100) Subject: [bitmap] Allow bitmap_set() to report an error X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de43024908ecb6b92f9adff79d198b419aae47ee;p=thirdparty%2Fipxe.git [bitmap] Allow bitmap_set() to report an error Signed-off-by: Michael Brown --- diff --git a/src/core/bitmap.c b/src/core/bitmap.c index e3570c629..d44e59c62 100644 --- a/src/core/bitmap.c +++ b/src/core/bitmap.c @@ -80,8 +80,10 @@ int bitmap_test ( struct bitmap *bitmap, unsigned int bit ) { unsigned int index = BITMAP_INDEX ( bit ); bitmap_block_t mask = BITMAP_MASK ( bit ); + /* Treat out-of-range bits as implicitly being zero */ if ( bit >= bitmap->length ) return 0; + return ( ( bitmap->blocks[index] & mask ) != 0 ); } @@ -90,13 +92,21 @@ int bitmap_test ( struct bitmap *bitmap, unsigned int bit ) { * * @v bitmap Bitmap * @v bit Bit index + * @ret rc Return status code */ -void bitmap_set ( struct bitmap *bitmap, unsigned int bit ) { +int bitmap_set ( struct bitmap *bitmap, unsigned int bit ) { unsigned int index = BITMAP_INDEX ( bit ); bitmap_block_t mask = BITMAP_MASK ( bit ); DBGC ( bitmap, "Bitmap %p setting bit %d\n", bitmap, bit ); + /* Fail if we cannot set this bit */ + if ( bit >= bitmap->length ) { + DBGC ( bitmap, "Bitmap %p bit %d is outside range [0,%d)\n", + bitmap, bit, bitmap->length ); + return -ERANGE; + } + /* Update bitmap */ bitmap->blocks[index] |= mask; @@ -104,4 +114,6 @@ void bitmap_set ( struct bitmap *bitmap, unsigned int bit ) { while ( bitmap_test ( bitmap, bitmap->first_gap ) ) { bitmap->first_gap++; } + + return 0; } diff --git a/src/include/ipxe/bitmap.h b/src/include/ipxe/bitmap.h index 7533d1bf9..b50ceb153 100644 --- a/src/include/ipxe/bitmap.h +++ b/src/include/ipxe/bitmap.h @@ -48,7 +48,7 @@ struct bitmap { extern int bitmap_resize ( struct bitmap *bitmap, unsigned int new_length ); extern int bitmap_test ( struct bitmap *bitmap, unsigned int bit ); -extern void bitmap_set ( struct bitmap *bitmap, unsigned int bit ); +extern int bitmap_set ( struct bitmap *bitmap, unsigned int bit ); /** * Free bitmap resources diff --git a/src/net/udp/slam.c b/src/net/udp/slam.c index 47f60080b..dcda33750 100644 --- a/src/net/udp/slam.c +++ b/src/net/udp/slam.c @@ -553,7 +553,8 @@ static int slam_mc_socket_deliver ( struct slam_request *slam, goto err; /* Mark block as received */ - bitmap_set ( &slam->bitmap, packet ); + if ( ( rc = bitmap_set ( &slam->bitmap, packet ) ) != 0 ) + goto err; /* If we have received all blocks, terminate */ if ( bitmap_full ( &slam->bitmap ) ) diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c index a1d971c19..d25c0653b 100644 --- a/src/net/udp/tftp.c +++ b/src/net/udp/tftp.c @@ -852,7 +852,8 @@ static int tftp_rx_data ( struct tftp_request *tftp, goto done; /* Mark block as received */ - bitmap_set ( &tftp->bitmap, block ); + if ( ( rc = bitmap_set ( &tftp->bitmap, block ) ) != 0 ) + goto done; /* Acknowledge block */ tftp_send_packet ( tftp );