]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
get rid of audit_reusename()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 1 Nov 2025 05:54:52 +0000 (01:54 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 13 Jan 2026 20:16:44 +0000 (15:16 -0500)
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
include/linux/audit.h
include/linux/fs.h
kernel/auditsc.c

index 4595b355b3cebb8b0c38ec1c3be7ccce904a6745..3ba712032f5582b18e7cc8d37e9310f80cf7381e 100644 (file)
 
 #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;
 }
index 536f8ee8da818c642aff343618ac45ed15314c0a..d936a604d056875d66e496dcad9f5af562930f11 100644 (file)
@@ -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,
index d49b969ab432c37c5da5ae650942937dc9e1d14f..abe9c95c4874137c463c1f8194c2f7c0d8cc295d 100644 (file)
@@ -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[];
index dd0563a8e0be441def12593c35d609c3d58284e2..67d8da92738100fcc25a87788f9982c72a87c109 100644 (file)
@@ -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