We're reading block address (next_block + b) so the bounds check should make sure that address is valid.
Add some tests that now pass (and some commented-out ones that don't). Signed-off-by: Andrew Price <[email protected]> --- gfs2/fsck/rgrepair.c | 2 +- tests/fsck.at | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gfs2/fsck/rgrepair.c b/gfs2/fsck/rgrepair.c index 2bddd91f..637e5271 100644 --- a/gfs2/fsck/rgrepair.c +++ b/gfs2/fsck/rgrepair.c @@ -392,7 +392,7 @@ static uint64_t find_next_rgrp_dist(struct gfs2_sbd *sdp, uint64_t blk, next_block = prevrgd->ri.ri_addr + rgrp_dist; /* Now we account for block rounding done by mkfs.gfs2 */ for (b = 0; b <= length + GFS2_NBBY; b++) { - if (next_block >= sdp->device.length) + if (next_block + b >= sdp->device.length) break; bh = bread(sdp, next_block + b); gfs2_meta_header_in(&mh, bh->b_data); diff --git a/tests/fsck.at b/tests/fsck.at index 727108f4..3b1c5af3 100644 --- a/tests/fsck.at +++ b/tests/fsck.at @@ -46,6 +46,26 @@ AT_KEYWORDS(fsck.gfs2 fsck) GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock $GFS_TGT], [-i 1]) AT_CLEANUP +AT_SETUP([2G RGs: Fix bad resource group #0]) +AT_KEYWORDS(fsck.gfs2 fsck) +GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock -r 2048 $GFS_TGT], [-r 0]) +AT_CLEANUP + +AT_SETUP([2G RGs: Fix bad resource group #1]) +AT_KEYWORDS(fsck.gfs2 fsck) +GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock -r 2048 $GFS_TGT], [-r 1]) +AT_CLEANUP + +#AT_SETUP([2G RGs: Fix bad rindex entry #0]) +#AT_KEYWORDS(fsck.gfs2 fsck) +#GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock -r 2048 $GFS_TGT], [-i 0]) +#AT_CLEANUP + +#AT_SETUP([2G RGs: Fix bad rindex entry #1]) +#AT_KEYWORDS(fsck.gfs2 fsck) +#GFS_NUKERG_CHECK([mkfs.gfs2 -O -p lock_nolock -r 2048 $GFS_TGT], [-i 1]) +#AT_CLEANUP + AT_SETUP([Rebuild bad journal]) AT_KEYWORDS(fsck.gfs2 fsck) GFS_TGT_REGEN -- 2.30.2
