From 36769c606c270094df0431cbcab9932905adcedc Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 23 Jan 2015 10:15:57 -0500 Subject: [PATCH] e2fsck: fix corruption of Hurd filesystems Previously, e2fsck accessed the field osd2.linux2.l_i_file_acl_high field without checking that the filesystem is indeed created for Linux. This lead to e2fsck constantly complaining about certain nodes: i_file_acl_hi for inode XXX (/dev/console) is 32, should be zero. By "correcting" this problem, e2fsck would clobber the field osd2.hurd2.h_i_mode_high. Properly guard access to the OS dependent fields. Signed-off-by: Theodore Ts'o --- e2fsck/pass1.c | 14 ++++++++------ e2fsck/pass2.c | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 50a8b99..3bf481f 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -1082,7 +1082,8 @@ void e2fsck_pass1(e2fsck_t ctx) if (inode->i_faddr || frag || fsize || (LINUX_S_ISDIR(inode->i_mode) && inode->i_dir_acl)) mark_inode_bad(ctx, ino); - if (!(fs->super->s_feature_incompat & + if ((fs->super->s_creator_os == EXT2_OS_LINUX) && + !(fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) && inode->osd2.linux2.l_i_file_acl_high != 0) mark_inode_bad(ctx, ino); @@ -2354,11 +2355,12 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, if (LINUX_S_ISREG(inode->i_mode) && ext2fs_needs_large_file_feature(EXT2_I_SIZE(inode))) ctx->large_files++; - if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) || - ((fs->super->s_feature_ro_compat & - EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && - (inode->i_flags & EXT4_HUGE_FILE_FL) && - (inode->osd2.linux2.l_i_blocks_hi != 0))) { + if ((fs->super->s_creator_os == EXT2_OS_LINUX) && + ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) || + ((fs->super->s_feature_ro_compat & + EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && + (inode->i_flags & EXT4_HUGE_FILE_FL) && + (inode->osd2.linux2.l_i_blocks_hi != 0)))) { pctx->num = pb.num_blocks; if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) { inode->i_blocks = pb.num_blocks; diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index ddfe2eb..4acddae 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -1365,7 +1365,8 @@ int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir, } } - if (!(fs->super->s_feature_incompat & + if ((fs->super->s_creator_os == EXT2_OS_LINUX) && + !(fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) && inode.osd2.linux2.l_i_file_acl_high != 0) { pctx.num = inode.osd2.linux2.l_i_file_acl_high; -- 1.8.3.1