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 );
}
*
* @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;
while ( bitmap_test ( bitmap, bitmap->first_gap ) ) {
bitmap->first_gap++;
}
+
+ return 0;
}
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
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 ) )
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 );