diff options
Diffstat (limited to 'e2fsck/pass2.c')
-rw-r--r-- | e2fsck/pass2.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index 13b398e1..a885f6f1 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -648,6 +648,12 @@ static void deallocate_inode(e2fsck_t ctx, ext2_ino_t ino, char* block_buf) if (!ext2fs_inode_has_valid_blocks(&inode)) return; + if (inode.i_file_acl) { + ext2fs_unmark_block_bitmap(ctx->block_found_map, + inode.i_file_acl); + ext2fs_unmark_block_bitmap(fs->block_map, inode.i_file_acl); + } + ext2fs_mark_bb_dirty(fs); pctx.errcode = ext2fs_block_iterate2(fs, ino, 0, block_buf, deallocate_inode_block, ctx); @@ -747,10 +753,18 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir, } if (inode.i_file_acl && + !(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) && fix_problem(ctx, PR_2_FILE_ACL_ZERO, &pctx)) { inode.i_file_acl = 0; inode_modified++; } + if (inode.i_file_acl && + ((inode.i_file_acl < fs->super->s_first_data_block) || + (inode.i_file_acl >= fs->super->s_blocks_count)) && + fix_problem(ctx, PR_2_FILE_ACL_BAD, &pctx)) { + inode.i_file_acl = 0; + inode_modified++; + } if (inode.i_dir_acl && LINUX_S_ISDIR(inode.i_mode) && fix_problem(ctx, PR_2_DIR_ACL_ZERO, &pctx)) { |