Skip to content

Commit befe455

Browse files
committed
libblkid: (bcachefs) fix size validation
Avoid signed shift out-of-bounds. Also mark the constants explitly as unsigned instead of casting. Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
1 parent 17873d3 commit befe455

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

libblkid/src/superblocks/bcache.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,19 @@ struct bcachefs_super_block {
143143
/* magic string len */
144144
#define BCACHE_SB_MAGIC_LEN (sizeof(BCACHE_SB_MAGIC) - 1)
145145
/* super block offset */
146-
#define BCACHE_SB_OFF 0x1000
146+
#define BCACHE_SB_OFF 0x1000U
147147
/* supper block offset in kB */
148148
#define BCACHE_SB_KBOFF (BCACHE_SB_OFF >> 10)
149149
/* magic string offset within super block */
150150
#define BCACHE_SB_MAGIC_OFF offsetof(struct bcache_super_block, magic)
151151
/* start of checksummed data within superblock */
152-
#define BCACHE_SB_CSUMMED_START 8
152+
#define BCACHE_SB_CSUMMED_START 8U
153153
/* granularity of offset and length fields within superblock */
154-
#define BCACHEFS_SECTOR_SIZE 512
154+
#define BCACHEFS_SECTOR_SIZE 512U
155+
/* maximum superblock size shift */
156+
#define BCACHEFS_SB_MAX_SIZE_SHIFT 0x10U
155157
/* maximum superblock size */
156-
#define BCACHEFS_SB_MAX_SIZE 0x100000
158+
#define BCACHEFS_SB_MAX_SIZE (1U << BCACHEFS_SB_MAX_SIZE_SHIFT)
157159
/* fields offset within super block */
158160
#define BCACHEFS_SB_FIELDS_OFF offsetof(struct bcachefs_super_block, _start)
159161
/* tag value for members field */
@@ -325,12 +327,16 @@ static int probe_bcachefs(blkid_probe pr, const struct blkid_idmag *mag)
325327
return BLKID_PROBE_NONE;
326328

327329
sb_size = BCACHEFS_SB_FIELDS_OFF + BYTES(bcs);
328-
if (sb_size > ((uint64_t) BCACHEFS_SECTOR_SIZE << bcs->layout.sb_max_size_bits))
329-
return BLKID_PROBE_NONE;
330330

331331
if (sb_size > BCACHEFS_SB_MAX_SIZE)
332332
return BLKID_PROBE_NONE;
333333

334+
if (bcs->layout.sb_max_size_bits > BCACHEFS_SB_MAX_SIZE_SHIFT)
335+
return BLKID_PROBE_NONE;
336+
337+
if (sb_size > (BCACHEFS_SECTOR_SIZE << bcs->layout.sb_max_size_bits))
338+
return BLKID_PROBE_NONE;
339+
334340
sb = blkid_probe_get_sb_buffer(pr, mag, sb_size);
335341
if (!sb)
336342
return BLKID_PROBE_NONE;

0 commit comments

Comments
 (0)