parallels: fix ext_off assertion failure due to overflow
This error was discovered by fuzzing qemu-img. When ph.ext_off has a sufficiently large value, the operation le64_to_cpu(ph.ext_off) << BDRV_SECTOR_BITS in parallels_read_format_extension() can cause an overflow in int64_t. This overflow triggers the assert(ext_off > 0) check in block/parallels-ext.c: parallels_read_format_extension(), leading to a crash. This commit adds a check to prevent overflow when shifting ph.ext_off by BDRV_SECTOR_BITS, ensuring that the value remains within a valid range. Reported-by: Leonid Reviakin <L.reviakin@fobos-nt.ru> Signed-off-by: Denis Rastyogin <gerben@altlinux.org> Reviewed-by: Denis V. Lunev <den@openvz.org> Message-ID: <20241212104212.513947-2-gerben@altlinux.org> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
871af84dd5
commit
58607752d1
@ -1298,6 +1298,10 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
error_setg(errp, "Catalog too large");
|
error_setg(errp, "Catalog too large");
|
||||||
return -EFBIG;
|
return -EFBIG;
|
||||||
}
|
}
|
||||||
|
if (le64_to_cpu(ph.ext_off) >= (INT64_MAX >> BDRV_SECTOR_BITS)) {
|
||||||
|
error_setg(errp, "Invalid image: Too big offset");
|
||||||
|
return -EFBIG;
|
||||||
|
}
|
||||||
|
|
||||||
size = bat_entry_off(s->bat_size);
|
size = bat_entry_off(s->bat_size);
|
||||||
s->header_size = ROUND_UP(size, bdrv_opt_mem_align(bs->file->bs));
|
s->header_size = ROUND_UP(size, bdrv_opt_mem_align(bs->file->bs));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user