diff --git a/e2fsck/ehandler.c b/e2fsck/ehandler.c index 6dddf9c1..71ca301c 100644 --- a/e2fsck/ehandler.c +++ b/e2fsck/ehandler.c @@ -58,6 +58,11 @@ static errcode_t e2fsck_handle_read_error(io_channel channel, printf(_("Error reading block %lu (%s). "), block, error_message(error)); preenhalt(ctx); + + /* Don't rewrite a block past the end of the FS. */ + if (block >= ext2fs_blocks_count(fs->super)) + return 0; + if (ask(ctx, _("Ignore error"), 1)) { if (ask(ctx, _("Force rewrite"), 1)) io_channel_write_blk64(channel, block, count, data); diff --git a/misc/e2fuzz.sh b/misc/e2fuzz.sh index 4cb7b61f..d8d9a82a 100755 --- a/misc/e2fuzz.sh +++ b/misc/e2fuzz.sh @@ -219,6 +219,7 @@ seq 1 "${PASSES}" | while read pass; do fi if [ "${RUN_FSCK}" -gt 0 ]; then cp "${PASS_IMG}" "${FSCK_IMG}" + pass_img_sz="$(stat -c '%s' "${PASS_IMG}")" seq 1 "${MAX_FSCK}" | while read fsck_pass; do echo "++ fsck pass ${fsck_pass}: $(which e2fsck) -fy ${FSCK_IMG} ${EXTENDED_FSCK_OPTS}" @@ -250,6 +251,12 @@ seq 1 "${PASSES}" | while read pass; do exit 2 fi fi + + fsck_img_sz="$(stat -c '%s' "${FSCK_IMG}")" + if [ "${fsck_img_sz}" -ne "${pass_img_sz}" ]; then + echo "++ fsck image size changed" + exit 3 + fi done fsck_loop_ret=$? if [ "${fsck_loop_ret}" -gt 0 ]; then