From: Al Viro <viro@zeniv.linux.org.uk>
To: linux-fsdevel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Mateusz Guzik <mjguzik@gmail.com>,
Paul Moore <paul@paul-moore.com>, Jens Axboe <axboe@kernel.dk>,
audit@vger.kernel.org, io-uring@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v5 15/68] get rid of audit_reusename()
Date: Wed, 14 Jan 2026 04:32:17 +0000 [thread overview]
Message-ID: <20260114043310.3885463-16-viro@zeniv.linux.org.uk> (raw)
In-Reply-To: <20260114043310.3885463-1-viro@zeniv.linux.org.uk>
Originally we tried to avoid multiple insertions into audit names array
during retry loop by a cute hack - memorize the userland pointer and
if there already is a match, just grab an extra reference to it.
Cute as it had been, it had problems - two identical pointers had
audit aux entries merged, two identical strings did not. Having
different behaviour for syscalls that differ only by addresses of
otherwise identical string arguments is obviously wrong - if nothing
else, compiler can decide to merge identical string literals.
Besides, this hack does nothing for non-audited processes - they get
a fresh copy for retry. It's not time-critical, but having behaviour
subtly differ that way is bogus.
These days we have very few places that import filename more than once
(9 functions total) and it's easy to massage them so we get rid of all
re-imports. With that done, we don't need audit_reusename() anymore.
There's no need to memorize userland pointer either.
Acked-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
fs/namei.c | 11 +++--------
include/linux/audit.h | 11 -----------
include/linux/fs.h | 1 -
kernel/auditsc.c | 23 -----------------------
4 files changed, 3 insertions(+), 43 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
index 4595b355b3ce..3ba712032f55 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -125,9 +125,8 @@
#define EMBEDDED_NAME_MAX (PATH_MAX - offsetof(struct filename, iname))
-static inline void initname(struct filename *name, const char __user *uptr)
+static inline void initname(struct filename *name)
{
- name->uptr = uptr;
name->aname = NULL;
atomic_set(&name->refcnt, 1);
}
@@ -139,10 +138,6 @@ getname_flags(const char __user *filename, int flags)
char *kname;
int len;
- result = audit_reusename(filename);
- if (result)
- return result;
-
result = __getname();
if (unlikely(!result))
return ERR_PTR(-ENOMEM);
@@ -210,7 +205,7 @@ getname_flags(const char __user *filename, int flags)
return ERR_PTR(-ENAMETOOLONG);
}
}
- initname(result, filename);
+ initname(result);
audit_getname(result);
return result;
}
@@ -268,7 +263,7 @@ struct filename *getname_kernel(const char * filename)
return ERR_PTR(-ENAMETOOLONG);
}
memcpy((char *)result->name, filename, len);
- initname(result, NULL);
+ initname(result);
audit_getname(result);
return result;
}
diff --git a/include/linux/audit.h b/include/linux/audit.h
index 536f8ee8da81..d936a604d056 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -316,7 +316,6 @@ extern void __audit_uring_exit(int success, long code);
extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1,
unsigned long a2, unsigned long a3);
extern void __audit_syscall_exit(int ret_success, long ret_value);
-extern struct filename *__audit_reusename(const __user char *uptr);
extern void __audit_getname(struct filename *name);
extern void __audit_inode(struct filename *name, const struct dentry *dentry,
unsigned int flags);
@@ -380,12 +379,6 @@ static inline void audit_syscall_exit(void *pt_regs)
__audit_syscall_exit(success, return_code);
}
}
-static inline struct filename *audit_reusename(const __user char *name)
-{
- if (unlikely(!audit_dummy_context()))
- return __audit_reusename(name);
- return NULL;
-}
static inline void audit_getname(struct filename *name)
{
if (unlikely(!audit_dummy_context()))
@@ -624,10 +617,6 @@ static inline struct audit_context *audit_context(void)
{
return NULL;
}
-static inline struct filename *audit_reusename(const __user char *name)
-{
- return NULL;
-}
static inline void audit_getname(struct filename *name)
{ }
static inline void audit_inode(struct filename *name,
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d49b969ab432..abe9c95c4874 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2411,7 +2411,6 @@ extern struct kobject *fs_kobj;
struct audit_names;
struct filename {
const char *name; /* pointer to actual string */
- const __user char *uptr; /* original userland pointer */
atomic_t refcnt;
struct audit_names *aname;
const char iname[];
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index dd0563a8e0be..67d8da927381 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -2169,29 +2169,6 @@ static struct audit_names *audit_alloc_name(struct audit_context *context,
return aname;
}
-/**
- * __audit_reusename - fill out filename with info from existing entry
- * @uptr: userland ptr to pathname
- *
- * Search the audit_names list for the current audit context. If there is an
- * existing entry with a matching "uptr" then return the filename
- * associated with that audit_name. If not, return NULL.
- */
-struct filename *
-__audit_reusename(const __user char *uptr)
-{
- struct audit_context *context = audit_context();
- struct audit_names *n;
-
- list_for_each_entry(n, &context->names_list, list) {
- if (!n->name)
- continue;
- if (n->name->uptr == uptr)
- return refname(n->name);
- }
- return NULL;
-}
-
/**
* __audit_getname - add a name to the list
* @name: name to add
--
2.47.3
next prev parent reply other threads:[~2026-01-14 4:31 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-14 4:32 [PATCH v5 00/68] struct filename series Al Viro
2026-01-14 4:32 ` [PATCH v5 01/68] init_mknod(): turn into a trivial wrapper for do_mknodat() Al Viro
2026-01-14 4:32 ` [PATCH v5 02/68] init_mkdir(): turn into a trivial wrapper for do_mkdirat() Al Viro
2026-01-14 4:32 ` [PATCH v5 03/68] init_symlink(): turn into a trivial wrapper for do_symlinkat() Al Viro
2026-01-14 4:32 ` [PATCH v5 04/68] init_link(): turn into a trivial wrapper for do_linkat() Al Viro
2026-01-14 4:32 ` [PATCH v5 05/68] allow to use CLASS() for struct filename * Al Viro
2026-01-14 4:32 ` [PATCH v5 06/68] do_faccessat(): import pathname only once Al Viro
2026-01-14 4:32 ` [PATCH v5 07/68] do_fchmodat(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 08/68] do_fchownat(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 09/68] do_utimes_path(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 10/68] chdir(2): " Al Viro
2026-01-14 4:32 ` [PATCH v5 11/68] chroot(2): " Al Viro
2026-01-14 4:32 ` [PATCH v5 12/68] user_statfs(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 13/68] do_sys_truncate(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 14/68] do_readlinkat(): " Al Viro
2026-01-14 4:32 ` Al Viro [this message]
2026-01-14 4:32 ` [PATCH v5 16/68] ntfs: ->d_compare() must not block Al Viro
2026-01-14 4:32 ` [PATCH v5 17/68] getname_flags() massage, part 1 Al Viro
2026-01-14 4:32 ` [PATCH v5 18/68] getname_flags() massage, part 2 Al Viro
2026-01-14 4:32 ` [PATCH v5 19/68] struct filename: use names_cachep only for getname() and friends Al Viro
2026-01-14 4:32 ` [PATCH v5 20/68] struct filename: saner handling of long names Al Viro
2026-01-14 4:32 ` [PATCH v5 21/68] fs: hide names_cache behind runtime const machinery Al Viro
2026-01-14 4:32 ` [PATCH v5 22/68] switch __getname_maybe_null() to CLASS(filename_flags) Al Viro
2026-01-14 4:32 ` [PATCH v5 23/68] allow incomplete imports of filenames Al Viro
2026-01-14 4:32 ` [PATCH v5 24/68] struct filename ->refcnt doesn't need to be atomic Al Viro
2026-01-14 4:32 ` [PATCH v5 25/68] file_getattr(): filename_lookup() accepts ERR_PTR() as filename Al Viro
2026-01-14 4:32 ` [PATCH v5 26/68] file_setattr(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 27/68] move_mount(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 28/68] ksmbd_vfs_path_lookup(): vfs_path_parent_lookup() accepts ERR_PTR() as name Al Viro
2026-01-14 4:32 ` [PATCH v5 29/68] ksmbd_vfs_rename(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 30/68] do_filp_open(): DTRT when getting ERR_PTR() as pathname Al Viro
2026-01-14 4:32 ` [PATCH v5 31/68] rename do_filp_open() to do_file_open() Al Viro
2026-01-14 4:32 ` [PATCH v5 32/68] do_sys_openat2(): get rid of useless check, switch to CLASS(filename) Al Viro
2026-01-14 4:32 ` [PATCH v5 33/68] simplify the callers of file_open_name() Al Viro
2026-01-14 4:32 ` [PATCH v5 34/68] simplify the callers of do_open_execat() Al Viro
2026-01-14 4:32 ` [PATCH v5 35/68] simplify the callers of alloc_bprm() Al Viro
2026-01-14 4:32 ` [PATCH v5 36/68] execve: fold {compat_,}do_execve{,at}() into their sole callers Al Viro
2026-01-14 4:32 ` [PATCH v5 37/68] do_execveat_common(): don't consume filename reference Al Viro
2026-01-14 4:32 ` [PATCH v5 38/68] switch {alloc,free}_bprm() to CLASS() Al Viro
2026-01-14 4:32 ` [PATCH v5 39/68] non-consuming variant of do_renameat2() Al Viro
2026-01-14 4:32 ` [PATCH v5 40/68] non-consuming variant of do_linkat() Al Viro
2026-01-14 4:32 ` [PATCH v5 41/68] non-consuming variant of do_symlinkat() Al Viro
2026-01-14 4:32 ` [PATCH v5 42/68] non-consuming variant of do_mkdirat() Al Viro
2026-01-14 4:32 ` [PATCH v5 43/68] non-consuming variant of do_mknodat() Al Viro
2026-01-14 4:32 ` [PATCH v5 44/68] non-consuming variants of do_{unlinkat,rmdir}() Al Viro
2026-01-14 4:32 ` [PATCH v5 45/68] file_[gs]etattr(2): switch to CLASS(filename_maybe_null) Al Viro
2026-01-14 4:32 ` [PATCH v5 46/68] mount_setattr(2): don't mess with LOOKUP_EMPTY Al Viro
2026-01-14 4:32 ` [PATCH v5 47/68] do_open_execat(): don't care about LOOKUP_EMPTY Al Viro
2026-01-14 4:32 ` [PATCH v5 48/68] vfs_open_tree(): use CLASS(filename_uflags) Al Viro
2026-01-14 4:32 ` [PATCH v5 49/68] name_to_handle_at(): " Al Viro
2026-01-14 4:32 ` [PATCH v5 50/68] fspick(2): use CLASS(filename_flags) Al Viro
2026-01-14 4:32 ` [PATCH v5 51/68] do_fchownat(): unspaghettify a bit Al Viro
2026-01-14 4:32 ` [PATCH v5 52/68] chdir(2): " Al Viro
2026-01-14 4:32 ` [PATCH v5 53/68] do_utimes_path(): switch to CLASS(filename_uflags) Al Viro
2026-01-14 4:32 ` [PATCH v5 54/68] do_sys_truncate(): switch to CLASS(filename) Al Viro
2026-01-14 4:32 ` [PATCH v5 55/68] do_readlinkat(): switch to CLASS(filename_flags) Al Viro
2026-01-14 4:32 ` [PATCH v5 56/68] do_f{chmod,chown,access}at(): use CLASS(filename_uflags) Al Viro
2026-01-14 4:32 ` [PATCH v5 57/68] namei.c: convert getname_kernel() callers to CLASS(filename_kernel) Al Viro
2026-01-14 4:33 ` [PATCH v5 58/68] namei.c: switch user pathname imports to CLASS(filename{,_flags}) Al Viro
2026-01-14 4:33 ` [PATCH v5 59/68] filename_...xattr(): don't consume filename reference Al Viro
2026-01-14 4:33 ` [PATCH v5 60/68] move_mount(2): switch to CLASS(filename_maybe_null) Al Viro
2026-01-14 4:33 ` [PATCH v5 61/68] chroot(2): switch to CLASS(filename) Al Viro
2026-01-14 4:33 ` [PATCH v5 62/68] quotactl_block(): " Al Viro
2026-01-14 4:33 ` [PATCH v5 63/68] statx: switch to CLASS(filename_maybe_null) Al Viro
2026-01-14 4:33 ` [PATCH v5 64/68] user_statfs(): switch to CLASS(filename) Al Viro
2026-01-14 4:33 ` [PATCH v5 65/68] mqueue: " Al Viro
2026-01-14 4:33 ` [PATCH v5 66/68] ksmbd: use CLASS(filename_kernel) Al Viro
2026-01-14 4:33 ` [PATCH v5 67/68] alpha: switch osf_mount() to strndup_user() Al Viro
2026-01-14 4:33 ` [PATCH v5 68/68] sysfs(2): fs_index() argument is _not_ a pathname Al Viro
2026-01-14 10:41 ` David Laight
2026-01-14 14:35 ` Al Viro
2026-01-14 16:51 ` David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260114043310.3885463-16-viro@zeniv.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=audit@vger.kernel.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=io-uring@vger.kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjguzik@gmail.com \
--cc=paul@paul-moore.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox