Fix integer overflow in get_next_chunk()

dn->dn_datablksz type is uint32_t and need to be casted to uint64_t
to avoid an overflow when the record size is greater than 4 MiB.

Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Olivier Mazouffre <olivier.mazouffre@ims-bordeaux.fr>
Closes #8778 
Closes #8797
This commit is contained in:
madz 2019-05-29 19:17:25 +02:00 committed by Brian Behlendorf
parent aaf3b30dcf
commit 580256045b

View File

@ -719,8 +719,8 @@ get_next_chunk(dnode_t *dn, uint64_t *start, uint64_t minimum, uint64_t *l1blks)
uint64_t blks; uint64_t blks;
uint64_t maxblks = DMU_MAX_ACCESS >> (dn->dn_indblkshift + 1); uint64_t maxblks = DMU_MAX_ACCESS >> (dn->dn_indblkshift + 1);
/* bytes of data covered by a level-1 indirect block */ /* bytes of data covered by a level-1 indirect block */
uint64_t iblkrange = uint64_t iblkrange = (uint64_t)dn->dn_datablksz *
dn->dn_datablksz * EPB(dn->dn_indblkshift, SPA_BLKPTRSHIFT); EPB(dn->dn_indblkshift, SPA_BLKPTRSHIFT);
ASSERT3U(minimum, <=, *start); ASSERT3U(minimum, <=, *start);