summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-06-15 02:34:37 +0530
committerLinus Torvalds <torvalds@linux-foundation.org>2026-06-15 02:34:37 +0530
commitd2cb5e633c6e8f2fb9af57e72fb05899952b1e3c (patch)
tree26c291704709fd0ad60d6898c5a5052d9402dcdf
parent8cd9520d35a6c38db6567e97dd93b1f11f185dc6 (diff)
parent07410646f6ff1d23222f105ccab778957d401bbe (diff)
Merge tag 'vfs-7.2-rc1.kfunc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull bpf filesystem kfunc fix from Christian Brauner: "The bpf_set_dentry_xattr() and bpf_remove_dentry_xattr() kfuncs locked the inode of the supplied dentry without checking whether the dentry is negative. Passing a negative dentry (e.g., from security_inode_create) caused a NULL pointer dereference. Negative dentries now fail with EINVAL. The WARN_ON(!inode) in the bpf xattr permission helpers is dropped as well since it could be triggered the same way, amounting to a denial of service on systems with panic_on_warn enabled" * tag 'vfs-7.2-rc1.kfunc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: bpf: fix crash in bpf_[set|remove]_dentry_xattr for negative dentries
-rw-r--r--fs/bpf_fs_kfuncs.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/bpf_fs_kfuncs.c b/fs/bpf_fs_kfuncs.c
index e4e51a1d0de2..606319dd69e8 100644
--- a/fs/bpf_fs_kfuncs.c
+++ b/fs/bpf_fs_kfuncs.c
@@ -100,7 +100,7 @@ static bool match_security_bpf_prefix(const char *name__str)
static int bpf_xattr_read_permission(const char *name, struct inode *inode)
{
- if (WARN_ON(!inode))
+ if (!inode)
return -EINVAL;
/* Allow reading xattr with user. and security.bpf. prefix */
@@ -170,7 +170,7 @@ __bpf_kfunc_end_defs();
static int bpf_xattr_write_permission(const char *name, struct inode *inode)
{
- if (WARN_ON(!inode))
+ if (!inode)
return -EINVAL;
/* Only allow setting and removing security.bpf. xattrs */
@@ -289,6 +289,9 @@ __bpf_kfunc int bpf_set_dentry_xattr(struct dentry *dentry, const char *name__st
struct inode *inode = d_inode(dentry);
int ret;
+ if (!inode)
+ return -EINVAL;
+
inode_lock(inode);
ret = bpf_set_dentry_xattr_locked(dentry, name__str, value_p, flags);
inode_unlock(inode);
@@ -314,6 +317,9 @@ __bpf_kfunc int bpf_remove_dentry_xattr(struct dentry *dentry, const char *name_
struct inode *inode = d_inode(dentry);
int ret;
+ if (!inode)
+ return -EINVAL;
+
inode_lock(inode);
ret = bpf_remove_dentry_xattr_locked(dentry, name__str);
inode_unlock(inode);