Skip to content

Commit

Permalink
f2fs-tools: ensure that unused xattr space is zeroized
Browse files Browse the repository at this point in the history
Make fsck.f2fs zeroize the unused xattr space, i.e. the space after the
end of the zero-terminated xattr list, if it isn't already zeroized.

This is important because the kernel currently does not explicitly
zero-terminate the list when writing xattrs.  So, the kernel relies on
the unused space containing zeroes.

Also, add a missing free() to fix a memory leak.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
  • Loading branch information
ebiggers authored and Jaegeuk Kim committed Oct 26, 2023
1 parent c9009e0 commit d860afa
Showing 1 changed file with 27 additions and 9 deletions.
36 changes: 27 additions & 9 deletions fsck/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -834,13 +834,25 @@ void fsck_reada_all_direct_node_blocks(struct f2fs_sb_info *sbi,
}
}

static bool is_zeroed(const u8 *p, size_t size)
{
size_t i;

for (i = 0; i < size; i++) {
if (p[i])
return false;
}
return true;
}

int chk_extended_attributes(struct f2fs_sb_info *sbi, u32 nid,
struct f2fs_node *inode)
{
void *xattr;
void *last_base_addr;
struct f2fs_xattr_entry *ent;
__u32 xattr_size = XATTR_SIZE(&inode->i);
bool need_fix = false;

if (xattr_size == 0)
return 0;
Expand All @@ -856,18 +868,24 @@ int chk_extended_attributes(struct f2fs_sb_info *sbi, u32 nid,
ASSERT_MSG("[0x%x] last xattr entry (offset: %lx) "
"crosses the boundary",
nid, (long int)((void *)ent - xattr));
if (c.fix_on) {
memset(ent, 0,
(char *)last_base_addr - (char *)ent);
write_all_xattrs(sbi, inode, xattr_size, xattr);
FIX_MSG("[0x%x] nullify wrong xattr entries",
nid);
return 1;
}
need_fix = true;
break;
}
}

if (!need_fix &&
!is_zeroed((u8 *)ent, (u8 *)last_base_addr - (u8 *)ent)) {
ASSERT_MSG("[0x%x] nonzero bytes in xattr space after "
"end of list", nid);
need_fix = true;
}
if (need_fix && c.fix_on) {
memset(ent, 0, (u8 *)last_base_addr - (u8 *)ent);
write_all_xattrs(sbi, inode, xattr_size, xattr);
FIX_MSG("[0x%x] nullify wrong xattr entries", nid);
free(xattr);
return 1;
}
free(xattr);
return 0;
}

Expand Down

0 comments on commit d860afa

Please sign in to comment.