Gitweb:
http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=9cd630b8...
Commit: 9cd630b8bc3315c0fd16a464896e302c4cf0e415
Parent: f4797121a2a3daebe333ac19ddc207157c5c8168
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Fri Jan 13 14:30:13 2017 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Mon Jan 16 15:43:23 2017 -0500
fsck.gfs2: Prevent rgrp segment overflow
Patch 0103dc0 (fsck.gfs2: Detect multiple rgrp grow segments) allowed
fsck to detect multiple gfs2_grow segments that may have placed
resource groups on unexpected boundaries. However, it failed to check
or take appropriate action when too many segments were found.
Instead, it would write past the arrays and corrupt memory. This
patch adds some sanity checks to prevent this from happening.
Signed-off-by: Bob Peterson <rpeterso(a)redhat.com>
---
gfs2/fsck/rgrepair.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/gfs2/fsck/rgrepair.c b/gfs2/fsck/rgrepair.c
index 55057ce..7479458 100644
--- a/gfs2/fsck/rgrepair.c
+++ b/gfs2/fsck/rgrepair.c
@@ -164,6 +164,8 @@ static int find_shortest_rgdist(struct gfs2_sbd *sdp, uint64_t
*dist_array,
/* That last one didn't pan out, so: */
dist_cnt[gsegment]--;
gsegment++;
+ if (gsegment >= MAX_RGSEGMENTS)
+ break;
}
if ((blk - block_last_rg) > (524288 * 2)) {
log_info(_("No rgrps were found within 4GB "
@@ -217,6 +219,8 @@ static int find_shortest_rgdist(struct gfs2_sbd *sdp, uint64_t
*dist_array,
}
} else {
gsegment++;
+ if (gsegment >= MAX_RGSEGMENTS)
+ break;
}
block_last_rg = blk;
if (rgs_sampled < 6)
@@ -224,7 +228,7 @@ static int find_shortest_rgdist(struct gfs2_sbd *sdp, uint64_t
*dist_array,
else
blk += shortest_dist_btwn_rgs - 1;
}
- if (gsegment > MAX_RGSEGMENTS) {
+ if (gsegment >= MAX_RGSEGMENTS) {
log_err(_("Maximum number of rgrp grow segments reached.\n"));
log_err(_("This file system cannot be repaired with fsck.\n"));
gsegment = 0;