diff options
| author | ZhengYuan Huang <gality369@gmail.com> | 2026-08-06 16:50:12 +0800 |
|---|---|---|
| committer | Andrew Morton <akpm@linux-foundation.org> | 2026-08-27 22:50:06 -0700 |
| commit | a8962c37dc98705eb879d51a431df607334a701d (patch) | |
| tree | ebe7ab5e080da4e467d2d13e651aa9a5359e14d6 /scripts/objdiff | |
| parent | 195ea954e24e797e0c13c130fdd5c2aa3cf12e2b (diff) | |
| download | linux-next-a8962c37dc98705eb879d51a431df607334a701d.tar.gz linux-next-a8962c37dc98705eb879d51a431df607334a701d.zip | |
ocfs2: reject inconsistent local xattr entries
[BUG]
A corrupt OCFS2 xattr entry can set OCFS2_XATTR_ENTRY_LOCAL while
keeping xe_value_size larger than OCFS2_XATTR_INLINE_SIZE. When that
entry reaches namevalue_size_xe(), the filesystem hits its BUG_ON:
kernel BUG at fs/ocfs2/xattr.c:231!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
RIP: 0010:namevalue_size_xe fs/ocfs2/xattr.c:231 [inline]
RIP: 0010:ocfs2_xa_block_wipe_namevalue+0x2e4/0x330 fs/ocfs2/xattr.c:1638
Call Trace:
ocfs2_xa_wipe_namevalue fs/ocfs2/xattr.c:1470 [inline]
ocfs2_xa_remove_entry+0xae/0x1d0 fs/ocfs2/xattr.c:1941
ocfs2_xa_remove fs/ocfs2/xattr.c:2043 [inline]
ocfs2_xa_set+0x11a8/0x30a0 fs/ocfs2/xattr.c:2247
ocfs2_xattr_ibody_set+0x302/0xc50 fs/ocfs2/xattr.c:2795
__ocfs2_xattr_set_handle+0x7e6/0xdb0 fs/ocfs2/xattr.c:3416
ocfs2_xattr_set+0x1447/0x2610 fs/ocfs2/xattr.c:3650
ocfs2_xattr_security_set+0x37/0x50 fs/ocfs2/xattr.c:7241
__vfs_removexattr+0x14d/0x1d0 fs/xattr.c:518
cap_inode_killpriv+0x29/0x50 security/commoncap.c:355
security_inode_killpriv+0x105/0x220 security/security.c:2724
setattr_prepare+0x147/0x8a0 fs/attr.c:219
ocfs2_setattr+0x504/0x1fd0 fs/ocfs2/file.c:1148
notify_change+0x4b5/0x1030 fs/attr.c:546
do_truncate+0x1d2/0x230 fs/open.c:68
handle_truncate fs/namei.c:3596 [inline]
do_open fs/namei.c:3979 [inline]
path_openat+0x260f/0x2ce0 fs/namei.c:4134
do_filp_open+0x1f6/0x430 fs/namei.c:4161
do_sys_openat2+0x117/0x1c0 fs/open.c:1437
...
[CAUSE]
namevalue_size_xe() assumes that local entries contain an inline value
no larger than OCFS2_XATTR_INLINE_SIZE. Existing xattr metadata
validation only checks whether the value fits the storage region, and
cached entries can reach lookup and bucket maintenance paths without a
semantic check. A corrupt entry can therefore be passed to
namevalue_size_xe().
[FIX]
Validate the local/value-size invariant in the existing flat and bucket
metadata validators and before accepting matched entries or traversing
bucket entries in paths that call namevalue_size_xe(). Return an OCFS2
corruption error instead of firing the assertion.
Link: https://lore.kernel.org/20260806085012.2650042-1-gality369@gmail.com
Signed-off-by: ZhengYuan Huang <gality369@gmail.com>
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Jun Piao <piaojun@huawei.com>
Cc: Heming Zhao <heming.zhao@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'scripts/objdiff')
0 files changed, 0 insertions, 0 deletions
