linux/fs/ext4
zhangyi (F) 6b22489911 ext4: do not try to set xattr into ea_inode if value is empty
Syzbot report a warning that ext4 may create an empty ea_inode if set
an empty extent attribute to a file on the file system which is no free
blocks left.

  WARNING: CPU: 6 PID: 10667 at fs/ext4/xattr.c:1640 ext4_xattr_set_entry+0x10f8/0x1114 fs/ext4/xattr.c:1640
  ...
  Call trace:
   ext4_xattr_set_entry+0x10f8/0x1114 fs/ext4/xattr.c:1640
   ext4_xattr_block_set+0x1d0/0x1b1c fs/ext4/xattr.c:1942
   ext4_xattr_set_handle+0x8a0/0xf1c fs/ext4/xattr.c:2390
   ext4_xattr_set+0x120/0x1f0 fs/ext4/xattr.c:2491
   ext4_xattr_trusted_set+0x48/0x5c fs/ext4/xattr_trusted.c:37
   __vfs_setxattr+0x208/0x23c fs/xattr.c:177
  ...

Now, ext4 try to store extent attribute into an external inode if
ext4_xattr_block_set() return -ENOSPC, but for the case of store an
empty extent attribute, store the extent entry into the extent
attribute block is enough. A simple reproduce below.

  fallocate test.img -l 1M
  mkfs.ext4 -F -b 2048 -O ea_inode test.img
  mount test.img /mnt
  dd if=/dev/zero of=/mnt/foo bs=2048 count=500
  setfattr -n "user.test" /mnt/foo

Reported-by: syzbot+98b881fdd8ebf45ab4ae@syzkaller.appspotmail.com
Fixes: 9c6e7853c5 ("ext4: reserve space for xattr entries/names")
Cc: stable@kernel.org
Signed-off-by: zhangyi (F) <yi.zhang@huawei.com>
Link: https://lore.kernel.org/r/20210305120508.298465-1-yi.zhang@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
2021-03-21 00:09:17 -04:00
..
.kunitconfig ext4: add .kunitconfig fragment to enable ext4-specific tests 2021-02-11 23:16:30 -05:00
acl.c ext4: support idmapped mounts 2021-01-24 14:43:46 +01:00
acl.h fs: make helpers idmap mount aware 2021-01-24 14:27:20 +01:00
balloc.c ext4: shrink race window in ext4_should_retry_alloc() 2021-03-06 11:56:10 -05:00
bitmap.c
block_validity.c ext4: standardize error message in ext4_protect_reserved_inode() 2020-12-17 13:30:55 -05:00
dir.c f2fs-for-5.11-rc1 2020-12-17 11:18:00 -08:00
ext4_extents.h ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max 2020-06-03 23:16:49 -04:00
ext4_jbd2.c ext4: drop ext4_handle_dirty_super() 2020-12-22 13:08:46 -05:00
ext4_jbd2.h ext4: drop ext4_handle_dirty_super() 2020-12-22 13:08:46 -05:00
ext4.h ext4: shrink race window in ext4_should_retry_alloc() 2021-03-06 11:56:10 -05:00
extents_status.c ext4: fast commit recovery path 2020-10-21 23:22:38 -04:00
extents_status.h ext4: fix extent_status trace points 2020-01-25 02:03:03 -05:00
extents.c ext4: reset retry counter when ext4_alloc_file_blocks() makes progress 2021-02-08 18:03:56 -05:00
fast_commit.c Miscellaneous ext4 cleanups and bug fixes. Pretty boring this 2021-02-25 10:06:55 -08:00
fast_commit.h ext4: make fast_commit.h byte identical with e2fsprogs/fast_commit.h 2020-12-17 13:30:45 -05:00
file.c iomap: pass a flags argument to iomap_dio_rw 2021-01-23 10:06:09 -08:00
fsmap.c jbd2: rename j_maxlen to j_total_len and add jbd2_journal_max_txn_bufs 2020-11-06 23:01:02 -05:00
fsmap.h
fsync.c block: use an on-stack bio in blkdev_issue_flush 2021-01-27 09:51:48 -07:00
hash.c ext4: use generic casefolding support 2020-10-28 13:43:13 -04:00
ialloc.c idmapped-mounts-v5.12 2021-02-23 13:39:45 -08:00
indirect.c ext4: use ASSERT() to replace J_ASSERT() 2020-12-03 09:36:57 -05:00
inline.c ext4: unlock xattr_sem properly in ext4_inline_data_truncate() 2020-11-06 22:52:36 -05:00
inode-test.c fs: ext4: Modify inode-test.c to use KUnit parameterized testing feature 2020-12-02 16:07:25 -07:00
inode.c ext4: fix bh ref count on error paths 2021-03-06 11:56:11 -05:00
ioctl.c idmapped-mounts-v5.12 2021-02-23 13:39:45 -08:00
Kconfig ext: EXT4_KUNIT_TESTS should depend on EXT4_FS instead of selecting it 2021-02-11 23:12:59 -05:00
Makefile ext4 / jbd2: add fast commit initialization 2020-10-21 23:22:26 -04:00
mballoc.c fs/ext4: fix integer overflow in s_log_groups_per_flex 2021-03-06 11:56:11 -05:00
mballoc.h ext4: limit the length of per-inode prealloc list 2020-08-19 12:04:36 -04:00
migrate.c ext4: handle ext4_mark_inode_dirty errors 2020-06-03 23:16:50 -04:00
mmp.c ext4: use common helpers in all places reading metadata buffers 2020-10-18 10:37:14 -04:00
move_extent.c ext4: use common helpers in all places reading metadata buffers 2020-10-18 10:37:14 -04:00
namei.c ext4: do not iput inode under running transaction in ext4_rename() 2021-03-21 00:09:14 -04:00
page-io.c ext4: remove unnecessary wbc parameter from ext4_bio_write_page 2020-12-22 13:08:45 -05:00
readpage.c block: Add bio_max_segs 2021-02-26 15:49:51 -07:00
resize.c ext4: drop ext4_handle_dirty_super() 2020-12-22 13:08:46 -05:00
super.c ext4: shrink race window in ext4_should_retry_alloc() 2021-03-06 11:56:10 -05:00
symlink.c
sysfs.c ext4: shrink race window in ext4_should_retry_alloc() 2021-03-06 11:56:10 -05:00
truncate.h
verity.c ext4: fix error handling in ext4_end_enable_verity() 2021-03-11 10:38:50 -05:00
xattr_hurd.c acl: handle idmapped mounts 2021-01-24 14:27:17 +01:00
xattr_security.c acl: handle idmapped mounts 2021-01-24 14:27:17 +01:00
xattr_trusted.c acl: handle idmapped mounts 2021-01-24 14:27:17 +01:00
xattr_user.c acl: handle idmapped mounts 2021-01-24 14:27:17 +01:00
xattr.c ext4: do not try to set xattr into ea_inode if value is empty 2021-03-21 00:09:17 -04:00
xattr.h ext4: support xattr gnu.* namespace for the Hurd 2020-06-12 13:23:34 -04:00