Overhaul the audit filename handling
Subsystems (3)
v2 cover Overhaul the audit filename handling
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in __audit_reusename() and a inode type in __audit_inode()).
This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Paul Moore (5):
fs: rework getname_kernel to handle up to PATH_MAX sized filenames
fs: create proper filename objects using getname_kernel()
audit: enable filename recording via getname_kernel()
audit: fix filename matching in __audit_inode() and __audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
fs/exec.c | 11 +++ fs/namei.c | 144 ++++++++++++++++++++++++++++------------- fs/open.c | 11 +++ include/linux/audit.h | 3 - include/linux/fs.h | 9 +-- kernel/audit.h | 17 +---- kernel/auditsc.c | 171 ++++++++++--------------------------------------- 7 files changed, 155 insertions(+), 211 deletions(-)
PATCH v2 1/5 fs: rework getname_kernel to handle up to PATH_MAX sized filenames
In preparation for expanded use in the kernel, make getname_kernel() more useful by allowing it to handle any legal filename length.
Thanks to Guenter Roeck for his suggestion to substitute memcpy() for strlcpy().
--- fs/namei.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-)
fs/namei.c +20 -14
@@ -211,32 +211,38 @@ getname(const char __user * filename)return getname_flags (filename,0 ,NULL ); } -/* -* The "getname_kernel()" interface doesn't do pathnames longer -* than EMBEDDED_NAME_MAX. Deal with it - you're a kernel user. -*/ struct filename *getname_kernel (const char * filename) {struct filename *result; -char *kname; -int len; - - len =strlen (filename); -if (len >=EMBEDDED_NAME_MAX ) -return ERR_PTR (-ENAMETOOLONG ); +int len =strlen (filename) +1 ; result =__getname ();if (unlikely (!result))return ERR_PTR (-ENOMEM ); - kname = (char *)result +sizeof (*result); - result->name = kname; +if (len <=EMBEDDED_NAME_MAX ) { + result->name = (char *)(result) +sizeof (*result); + result->separate = false; + }else if (len <=PATH_MAX ) { +struct filename *tmp; + + tmp =kmalloc (sizeof (*tmp),GFP_KERNEL ); +if (unlikely (!tmp)) { +__putname (result); +return ERR_PTR (-ENOMEM ); + } + tmp->name = (char *)result; + tmp->separate = true; + result = tmp; + }else { +__putname (result); +return ERR_PTR (-ENAMETOOLONG ); + } +memcpy ((char *)result->name, filename, len); result->uptr =NULL ; result->aname =NULL ; - result->separate = false; -strlcpy (kname, filename,EMBEDDED_NAME_MAX );return result; }
Re: [PATCH v2 1/5] fs: rework getname_kernel to handle up to PATH_MAX sized filenames
Quoted 10 lines · Paul Moore
In preparation for expanded use in the kernel, make
getname_kernel()more useful by allowing it to handle any legal filename length.Thanks to Guenter Roeck for his suggestion to substitute
memcpy()forstrlcpy().Signed-off-by Paul Moore <[email protected]>
Noted memcpy() difference (I assume to avoid races).
Quoted 52 lines
--- fs/namei.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-)fs/namei.c +18
-12@@ -211,32 +211,38 @@ getname(const char __user * filename)return getname_flags (filename,0 ,NULL ); } -/* -* The "getname_kernel()" interface doesn't do pathnames longer -* than EMBEDDED_NAME_MAX. Deal with it - you're a kernel user. -*/ struct filename *getname_kernel (const char * filename) {struct filename *result; -char *kname; -int len; - - len =strlen (filename); -if (len >=EMBEDDED_NAME_MAX ) -return ERR_PTR (-ENAMETOOLONG ); +int len =strlen (filename) +1 ; result =__getname ();if (unlikely (!result))return ERR_PTR (-ENOMEM ); - kname = (char *)result +sizeof (*result); - result->name = kname; +if (len <=EMBEDDED_NAME_MAX ) { + result->name = (char *)(result) +sizeof (*result); + result->separate = false; + }else if (len <=PATH_MAX ) { +struct filename *tmp; + + tmp =kmalloc (sizeof (*tmp),GFP_KERNEL ); +if (unlikely (!tmp)) { +__putname (result); +return ERR_PTR (-ENOMEM ); + } + tmp->name = (char *)result; + tmp->separate = true; + result = tmp; + }else { +__putname (result); +return ERR_PTR (-ENAMETOOLONG );
fs/namei.c getname(const char __user * filename) · line 248
Quoted 10 lines
fs/namei.c +2
-2+ } +memcpy ((char *)result->name, filename, len); result->uptr =NULL ; result->aname =NULL ; - result->separate = false; -strlcpy (kname, filename,EMBEDDED_NAME_MAX );return result; }
- RGB
--
Richard Guy Briggs <[email protected]>
Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada
Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545
Re: [PATCH v2 1/5] fs: rework getname_kernel to handle up to PATH_MAX sized filenames
Quoted 7 lines · Richard Guy Briggs
Quoted 6 lines · Paul Moore
In preparation for expanded use in the kernel, make
getname_kernel()more useful by allowing it to handle any legal filename length.Thanks to Guenter Roeck for his suggestion to substitute
memcpy()forstrlcpy().
Quoted 7 lines
Quoted 4 lines
Signed-off-by Paul Moore <[email protected]>Noted
memcpy()difference (I assume to avoid races).
It is more efficient to use memcpy if the string length is known.
Guenter
PATCH v2 2/5 fs: create proper filename objects using getname_kernel()
In reply to Paul MooreThere are several areas in the kernel that create temporary filename objects using the following pattern:
int func(const char *name)
{
struct filename *file = { .name = name };
...
return 0;
}... which for the most part works okay, but it causes havoc within the audit subsystem as the filename object does not persist beyond the lifetime of the function. This patch converts all of these temporary filename objects into proper filename objects using getname_kernel() and putname() which ensure that the filename object persists until the audit subsystem is finished with it.
Also, a special thanks to Al Viro, Guenter Roeck, and Sabrina Dubroca for helping resolve a difficult kernel panic on boot related to a use-after-free problem in kern_path_create(); the thread can be seen at the link below:
* https://lkml.org/lkml/2015/1/20/710
This patch includes code that was either based on, or directly written by Al in the above thread.
--- fs/exec.c | 11 +++++++- fs/namei.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++------------- fs/open.c | 11 +++++++- 3 files changed, 81 insertions(+), 21 deletions(-)
fs/exec.c +9 -2
@@ -789,8 +789,15 @@ exit:struct file *open_exec (const char *name) { -struct filename tmp = { .name = name }; -return do_open_exec (&tmp); +struct file *file; +struct filename *tmp; + + tmp =getname_kernel (name); +if (unlikely (IS_ERR (tmp))) +return (void *)tmp; + file =do_open_exec (tmp); +putname (tmp); +return file; }EXPORT_SYMBOL (open_exec);
fs/namei.c +63 -17
145 lines not on this page · raw message
fs/open.c +9 -2
@@ -940,8 +940,15 @@ struct file *file_open_name(struct filename *name, int flags, umode_t mode)*/ struct file *filp_open (const char *filename,int flags,umode_t mode) { -struct filename name = {.name = filename}; -return file_open_name (&name, flags, mode); +struct file *file; +struct filename *name; + + name =getname_kernel (filename); +if (unlikely (IS_ERR (name))) +return ERR_CAST (name); + file =file_open_name (name, flags, mode); +putname (name); +return file; }EXPORT_SYMBOL (filp_open);
Re: [PATCH v2 2/5] fs: create proper filename objects using getname_kernel()
Quoted 24 lines · Paul Moore
There are several areas in the kernel that create temporary filename objects using the following pattern:
int func(const char *name) { struct filename *file = { .name = name }; ... return 0; }... which for the most part works okay, but it causes havoc within the audit subsystem as the filename object does not persist beyond the lifetime of the function. This patch converts all of these temporary filename objects into proper filename objects using
getname_kernel()andputname()which ensure that the filename object persists until the audit subsystem is finished with it.Also, a special thanks to Al Viro, Guenter Roeck, and Sabrina Dubroca for helping resolve a difficult kernel panic on boot related to a use-after-free problem in
kern_path_create(); the thread can be seen at the link below:
Quoted 8 lines
This patch includes code that was either based on, or directly written by Al in the above thread.
Signed-off-by Paul Moore <[email protected]>
Noted change to use ERR_CAST() for consistency.
Quoted 197 lines
--- fs/exec.c | 11 +++++++- fs/namei.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++------------- fs/open.c | 11 +++++++- 3 files changed, 81 insertions(+), 21 deletions(-)fs/exec.c +9
-2@@ -789,8 +789,15 @@ exit:struct file *open_exec (const char *name) { -struct filename tmp = { .name = name }; -return do_open_exec (&tmp); +struct file *file; +struct filename *tmp; + + tmp =getname_kernel (name); +if (unlikely (IS_ERR (tmp))) +return (void *)tmp; + file =do_open_exec (tmp); +putname (tmp); +return file; }EXPORT_SYMBOL (open_exec);fs/namei.c +63
-17@@ -2001,31 +2001,50 @@ static int filename_lookup(int dfd, struct filename *name,static int do_path_lookup (int dfd,const char *name,unsigned int flags,struct nameidata *nd) { -struct filename filename = { .name = name }; +int retval; +struct filename *filename; -return filename_lookup (dfd, &filename, flags, nd); + filename =getname_kernel (name); +if (unlikely (IS_ERR (filename))) +return PTR_ERR (filename); + retval =filename_lookup (dfd, filename, flags, nd); +putname (filename); +return retval; }/* does lookup, returns the object with parent locked */ struct dentry *kern_path_locked (const char *name,struct path *path) { +struct filename *filename;struct nameidata nd;struct dentry *d; -int err =do_path_lookup (AT_FDCWD , name,LOOKUP_PARENT , &nd); -if (err) -return ERR_PTR (err); +int err; + + filename =getname_kernel (name); +if (IS_ERR (filename)) +return ERR_CAST (filename); + + err =filename_lookup (AT_FDCWD , filename,LOOKUP_PARENT , &nd); +if (err) { + d =ERR_PTR (err); + goto out; + }if (nd.last_type !=LAST_NORM ) {path_put (&nd.path); -return ERR_PTR (-EINVAL ); + d =ERR_PTR (-EINVAL ); + goto out; }mutex_lock_nested (&nd.path.dentry->d_inode->i_mutex,I_MUTEX_PARENT ); d =__lookup_hash (&nd.last, nd.path.dentry,0 );if (IS_ERR (d)) {mutex_unlock (&nd.path.dentry->d_inode->i_mutex);path_put (&nd.path); -return d; + goto out; } *path = nd.path; + +out: +putname (filename);return d; }@@ -2368,8 +2387,15 @@ int kern_path_mountpoint(int dfd, const char *name, struct path *path, unsigned int flags) { - struct filename s = {.name = name}; -return filename_mountpoint (dfd, &s, path, flags); + int retval; +struct filename *s; + + s =getname_kernel (name); +if (unlikely (IS_ERR (s))) +return PTR_ERR (s); + retval =filename_mountpoint (dfd, s, path, flags); +putname (s); +return retval; }EXPORT_SYMBOL (kern_path_mountpoint);@@ -3259,7 +3285,7 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, {struct nameidata nd;struct file *file; -struct filename filename = { .name = name }; +struct filename *filename;int flags = op->lookup_flags |LOOKUP_ROOT ; nd.root.mnt = mnt;@@ -3268,16 +3294,22 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt,if (d_is_symlink (dentry) && op->intent &LOOKUP_OPEN )return ERR_PTR (-ELOOP ); - file =path_openat (-1 , &filename, &nd, op, flags |LOOKUP_RCU ); + filename =getname_kernel (name); +if (unlikely (IS_ERR (filename))) +return ERR_CAST (filename); + + file =path_openat (-1 , filename, &nd, op, flags |LOOKUP_RCU );if (unlikely (file ==ERR_PTR (-ECHILD ))) - file =path_openat (-1 , &filename, &nd, op, flags); + file =path_openat (-1 , filename, &nd, op, flags);if (unlikely (file ==ERR_PTR (-ESTALE ))) - file =path_openat (-1 , &filename, &nd, op, flags |LOOKUP_REVAL ); + file =path_openat (-1 , filename, &nd, op, flags |LOOKUP_REVAL ); +putname (filename);return file; } -struct dentry *kern_path_create (int dfd,const char *pathname, -struct path *path,unsigned int lookup_flags) +static struct dentry *filename_create (int dfd,struct filename *name, +struct path *path, +unsigned int lookup_flags) {struct dentry *dentry =ERR_PTR (-EEXIST );struct nameidata nd;@@ -3291,7 +3323,7 @@ struct dentry *kern_path_create(int dfd, const char *pathname,*/ lookup_flags &=LOOKUP_REVAL ; - error =do_path_lookup (dfd, pathname,LOOKUP_PARENT |lookup_flags, &nd); + error =filename_lookup (dfd, name,LOOKUP_PARENT |lookup_flags, &nd);if (error)return ERR_PTR (error);@@ -3345,6 +3377,20 @@ out:path_put (&nd.path);return dentry; } + +struct dentry *kern_path_create (int dfd,const char *pathname, +struct path *path,unsigned int lookup_flags) +{ +struct filename *filename; +struct dentry *res; + + filename =getname_kernel (pathname); +if (IS_ERR (filename)) +return ERR_CAST (filename); + res =filename_create (dfd, filename, path, lookup_flags); +putname (filename); +return res; +}EXPORT_SYMBOL (kern_path_create);void done_path_create (struct path *path,struct dentry *dentry)@@ -3363,7 +3409,7 @@ struct dentry *user_path_create(int dfd, const char __user *pathname,struct dentry *res;if (IS_ERR (tmp))return ERR_CAST (tmp); - res =kern_path_create (dfd, tmp->name, path, lookup_flags); + res =filename_create (dfd, tmp, path, lookup_flags);putname (tmp);return res; }fs/open.c +2
-2@@ -940,8 +940,15 @@ struct file *file_open_name(struct filename *name, int flags, umode_t mode)*/ struct file *filp_open (const char *filename,int flags,umode_t mode) { -struct filename name = {.name = filename}; -return file_open_name (&name, flags, mode); +struct file *file; +struct filename *name;
fs/open.c struct file *file_open_name(struct filename *name, int flags, umode_t mode) · line 954
Quoted 10 lines
fs/open.c +7
-0+ + name =getname_kernel (filename); +if (unlikely (IS_ERR (name))) +return ERR_CAST (name); + file =file_open_name (name, flags, mode); +putname (name); +return file; }EXPORT_SYMBOL (filp_open);
- RGB
--
Richard Guy Briggs <[email protected]>
Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada
Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545
PATCH v2 3/5 audit: enable filename recording via getname_kernel()
In reply to Paul MooreEnable recording of filenames in getname_kernel() and remove the kludgy workaround in __audit_inode() now that we have proper filename logging for kernel users.
--- fs/namei.c | 1 + kernel/auditsc.c | 40 +++------------------------------------- 2 files changed, 4 insertions(+), 37 deletions(-)
fs/namei.c +1 -0
@@ -242,6 +242,7 @@ getname_kernel(const char * filename)memcpy ((char *)result->name, filename, len); result->uptr =NULL ; result->aname =NULL ; +audit_getname (result);return result; }
kernel/auditsc.c +3 -37
@@ -1882,44 +1882,10 @@ out_alloc: n =audit_alloc_name (context,AUDIT_TYPE_UNKNOWN );if (!n)return ; -/* unfortunately, while we may have a path name to record with the -* inode, we can't always rely on the string lasting until the end of -* the syscall so we need to create our own copy, it may fail due to -* memory allocation issues, but we do our best */ -if (name) { -/* we can't use getname_kernel() due to size limits */ -size_t len =strlen (name->name) +1 ; -struct filename *new =__getname (); - -if (unlikely (!new)) - goto out; +if (name) +/* no need to set ->name_put as the original will cleanup */ + n->name = name; -if (len <= (PATH_MAX -sizeof (*new))) { - new->name = (char *)(new) +sizeof (*new); - new->separate = false; - }else if (len <=PATH_MAX ) { -/* this looks odd, but is due to final_putname() */ -struct filename *new2; - - new2 =kmalloc (sizeof (*new2),GFP_KERNEL ); -if (unlikely (!new2)) { -__putname (new); - goto out; - } - new2->name = (char *)new; - new2->separate = true; - new = new2; - }else { -/* we should never get here, but let's be safe */ -__putname (new); - goto out; - } -strlcpy ((char *)new->name, name->name, len); - new->uptr =NULL ; - new->aname = n; - n->name = new; - n->name_put = true; - } out:if (parent) { n->name_len = n->name ?parent_len (n->name->name) :AUDIT_NAME_FULL ;
PATCH v2 4/5 audit: fix filename matching in __audit_inode() and __audit_inode_child()
In reply to Paul MooreIn all likelihood there were some subtle, and perhaps not so subtle, bugs with filename matching in audit_inode() and audit_inode_child() for some time, however, recent changes to the audit filename code have definitely broken the filename matching code. The breakage could result in duplicate filenames in the audit log and other odd audit record entries. This patch fixes the filename matching code and restores some sanity to the filename audit records.
--- kernel/auditsc.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)
kernel/auditsc.c +25 -9
@@ -1846,6 +1846,7 @@ void __audit_inode(struct filename *name, const struct dentry *dentry,/* The struct filename _must_ have a populated ->name */ BUG_ON (!name->name);#endif +/* * If we have a pointer to an audit_names entry already, then we can * just use it directly if the type is correct.
@@ -1863,7 +1864,17 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, }list_for_each_entry_reverse (n, &context->names_list, list) { -if (!n->name ||strcmp (n->name->name, name->name)) +if (n->ino) { +/* valid inode number, use that for the comparison */ +if (n->ino != inode->i_ino || + n->dev != inode->i_sb->s_dev) +continue ; + }else if (n->name) { +/* inode number has not been set, check the name */ +if (strcmp (n->name->name, name->name)) +continue ; + }else +/* no inode and no name (?!) ... this is odd ... */ continue ;/* match the correct record type */
@@ -1931,11 +1942,16 @@ void __audit_inode_child(const struct inode *parent,/* look for a parent entry first */ list_for_each_entry (n, &context->names_list, list) { -if (!n->name || n->type !=AUDIT_TYPE_PARENT ) +if (!n->name || + (n->type !=AUDIT_TYPE_PARENT && + n->type !=AUDIT_TYPE_UNKNOWN ))continue ; -if (n->ino == parent->i_ino && - !audit_compare_dname_path (dname, n->name->name, n->name_len)) { +if (n->ino == parent->i_ino && n->dev == parent->i_sb->s_dev && + !audit_compare_dname_path (dname, + n->name->name, n->name_len)) { +if (n->type ==AUDIT_TYPE_UNKNOWN ) + n->type =AUDIT_TYPE_PARENT ; found_parent = n;break ; }
@@ -1944,11 +1960,8 @@ void __audit_inode_child(const struct inode *parent,/* is there a matching child entry? */ list_for_each_entry (n, &context->names_list, list) {/* can only match entries that have a name */ -if (!n->name || n->type != type) -continue ; - -/* if we found a parent, make sure this one is a child of it */ -if (found_parent && (n->name != found_parent->name)) +if (!n->name || + (n->type != type && n->type !=AUDIT_TYPE_UNKNOWN ))continue ; if (!strcmp(dname, n->name->name) ||
@@ -1956,6 +1969,8 @@ void __audit_inode_child(const struct inode *parent, found_parent ? found_parent->name_len : AUDIT_NAME_FULL)) { +if (n->type ==AUDIT_TYPE_UNKNOWN ) + n->type = type; found_child = n;break ; }
@@ -1984,6 +1999,7 @@ void __audit_inode_child(const struct inode *parent, found_child->name_put = false; } } +if (inode)audit_copy_inode (found_child, dentry, inode);else
Re: [PATCH v2 4/5] audit: fix filename matching in __audit_inode() and __audit_inode_child()
Quoted 11 lines · Paul Moore
In all likelihood there were some subtle, and perhaps not so subtle, bugs with filename matching in
audit_inode()andaudit_inode_child()for some time, however, recent changes to the audit filename code have definitely broken the filename matching code. The breakage could result in duplicate filenames in the audit log and other odd audit record entries. This patch fixes the filename matching code and restores some sanity to the filename audit records.
Noted change to use the iterator instead of the reference in the inode check.
Quoted 80 lines
--- kernel/auditsc.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)kernel/auditsc.c +24
-9@@ -1846,6 +1846,7 @@ void __audit_inode(struct filename *name, const struct dentry *dentry,/* The struct filename _must_ have a populated ->name */ BUG_ON (!name->name);#endif +/* * If we have a pointer to an audit_names entry already, then we can * just use it directly if the type is correct. @@ -1863,7 +1864,17 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, }list_for_each_entry_reverse (n, &context->names_list, list) { -if (!n->name ||strcmp (n->name->name, name->name)) +if (n->ino) { +/* valid inode number, use that for the comparison */ +if (n->ino != inode->i_ino || + n->dev != inode->i_sb->s_dev) +continue ; + }else if (n->name) { +/* inode number has not been set, check the name */ +if (strcmp (n->name->name, name->name)) +continue ; + }else +/* no inode and no name (?!) ... this is odd ... */ continue ;/* match the correct record type */ @@ -1931,11 +1942,16 @@ void __audit_inode_child(const struct inode *parent,/* look for a parent entry first */ list_for_each_entry (n, &context->names_list, list) { -if (!n->name || n->type !=AUDIT_TYPE_PARENT ) +if (!n->name || + (n->type !=AUDIT_TYPE_PARENT && + n->type !=AUDIT_TYPE_UNKNOWN ))continue ; -if (n->ino == parent->i_ino && - !audit_compare_dname_path (dname, n->name->name, n->name_len)) { +if (n->ino == parent->i_ino && n->dev == parent->i_sb->s_dev && + !audit_compare_dname_path (dname, + n->name->name, n->name_len)) { +if (n->type ==AUDIT_TYPE_UNKNOWN ) + n->type =AUDIT_TYPE_PARENT ; found_parent = n;break ; }@@ -1944,11 +1960,8 @@ void __audit_inode_child(const struct inode *parent,/* is there a matching child entry? */ list_for_each_entry (n, &context->names_list, list) {/* can only match entries that have a name */ -if (!n->name || n->type != type) -continue ; - -/* if we found a parent, make sure this one is a child of it */ -if (found_parent && (n->name != found_parent->name)) +if (!n->name || + (n->type != type && n->type !=AUDIT_TYPE_UNKNOWN ))continue ; if (!strcmp(dname, n->name->name) ||@@ -1956,6 +1969,8 @@ void __audit_inode_child(const struct inode *parent, found_parent ? found_parent->name_len : AUDIT_NAME_FULL)) { +if (n->type ==AUDIT_TYPE_UNKNOWN ) + n->type = type; found_child = n;break ; }
kernel/auditsc.c void __audit_inode_child(const struct inode *parent, · line 2005
Quoted 7 lines
kernel/auditsc.c +1
-0@@ -1984,6 +1999,7 @@ void __audit_inode_child(const struct inode *parent, found_child->name_put = false; } } +if (inode)audit_copy_inode (found_child, dentry, inode);else
- RGB
--
Richard Guy Briggs <[email protected]>
Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada
Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545
PATCH v2 5/5 audit: replace getname()/putname() hacks with reference counters
In reply to Paul MooreIn order to ensure that filenames are not released before the audit subsystem is done with the strings there are a number of hacks built into the fs and audit subsystems around getname() and putname(). To say these hacks are "ugly" would be kind.
This patch removes the filename hackery in favor of a more conventional reference count based approach. The diffstat below tells most of the story; lots of audit/fs specific code is replaced with a traditional reference count based approach that is easily understood, even by those not familiar with the audit and/or fs subsystems.
--- fs/namei.c | 29 +++++++------- include/linux/audit.h | 3 - include/linux/fs.h | 9 +--- kernel/audit.h | 17 +------- kernel/auditsc.c | 105 +++++-------------------------------------------- 5 files changed, 29 insertions(+), 134 deletions(-)
fs/namei.c +14 -15
@@ -117,15 +117,6 @@* POSIX.1 2.4: an empty pathname is invalid (ENOENT). * PATH_MAX includes the nul terminator --RR. */ -void final_putname (struct filename *name) -{ -if (name->separate) { -__putname (name->name); -kfree (name); - }else { -__putname (name); - } -}#define EMBEDDED_NAME_MAX (PATH_MAX - sizeof(struct filename))
@@ -144,6 +135,7 @@ getname_flags(const char __user *filename, int flags, int *empty) result =__getname ();if (unlikely (!result))return ERR_PTR (-ENOMEM ); + result->refcnt =1 ;/* * First, try to embed the struct filename inside the names_cache
@@ -178,6 +170,7 @@ recopy: } result->name = kname; result->separate = true; + result->refcnt =1 ; max =PATH_MAX ; goto recopy; }
@@ -201,7 +194,7 @@ recopy:return result; error: -final_putname (result); +putname (result);return err; }
@@ -242,19 +235,25 @@ getname_kernel(const char * filename)memcpy ((char *)result->name, filename, len); result->uptr =NULL ; result->aname =NULL ; + result->refcnt =1 ;audit_getname (result);return result; } -#ifdef CONFIG_AUDITSYSCALL void putname (struct filename *name) { -if (unlikely (!audit_dummy_context ())) -return audit_putname (name); -final_putname (name); +BUG_ON (name->refcnt <=0 ); + +if (--name->refcnt >0 ) +return ; + +if (name->separate) { +__putname (name->name); +kfree (name); + }else +__putname (name); } -#endif static int check_acl (struct inode *inode,int mask) {
include/linux/audit.h +0 -3
@@ -127,7 +127,6 @@ extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1,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_putname (struct filename *name);#define AUDIT_INODE_PARENT 1/* dentry represents the parent */ #define AUDIT_INODE_HIDDEN 2/* audit record should be hidden */
@@ -346,8 +345,6 @@ static inline struct filename *audit_reusename(const __user char *name) }static inline void audit_getname (struct filename *name) { } -static inline void audit_putname (struct filename *name) -{ }static inline void __audit_inode (struct filename *name,const struct dentry *dentry,unsigned int flags)
include/linux/fs.h +2 -7
@@ -2017,6 +2017,7 @@ struct filename {const char *name;/* pointer to actual string */ const __user char *uptr;/* original userland pointer */ struct audit_names *aname; +int refcnt;bool separate;/* should "name" be freed? */ };
@@ -2036,6 +2037,7 @@ extern int filp_close(struct file *, fl_owner_t id);extern struct filename *getname (const char __user *);extern struct filename *getname_kernel (const char *); +extern void putname (struct filename *name);enum {FILE_CREATED =1 ,
@@ -2056,15 +2058,8 @@ extern void __init vfs_caches_init(unsigned long);extern struct kmem_cache *names_cachep; -extern void final_putname (struct filename *name); -#define __getname () kmem_cache_alloc(names_cachep, GFP_KERNEL)#define __putname (name) kmem_cache_free(names_cachep, (void *)(name)) -#ifndef CONFIG_AUDITSYSCALL -#define putname (name) final_putname(name) -#else -extern void putname (struct filename *name); -#endif #ifdef CONFIG_BLOCK extern int register_blkdev (unsigned int ,const char *);
kernel/audit.h +2 -15
@@ -24,12 +24,6 @@#include <linux/skbuff.h> #include <uapi/linux/mqueue.h> -/* 0 = no checking -1 = put_count checking -2 = verbose put_count checking -*/ -#define AUDIT_DEBUG 0 -/* AUDIT_NAMES is the number of slots we reserve in the audit_context * for saving names from getname(). If we get more names we will allocate * a name dynamically and also add those to the list anchored by names_list. */
@@ -74,9 +68,8 @@ struct audit_cap_data { }; }; -/* When fs/namei.c:getname() is called, we store the pointer in name and -* we don't let putname() free it (instead we free all of the saved -* pointers at syscall exit time). +/* When fs/namei.c:getname() is called, we store the pointer in name and bump +* the refcnt in the associated filename struct. * * Further, in fs/namei.c:path_lookup() we store the inode and device. */
@@ -86,7 +79,6 @@ struct audit_names {struct filename *name;int name_len;/* number of chars to log */ bool hidden;/* don't log this record */ -bool name_put;/* call __putname()? */ unsigned long ino;dev_t dev;
@@ -208,11 +200,6 @@ struct audit_context { };int fds[2 ];struct audit_proctitle proctitle; - -#if AUDIT_DEBUG -int put_count; -int ino_count; -#endif };extern u32 audit_ever_enabled;
kernel/auditsc.c +11 -94
164 lines not on this page · raw message
Re: [PATCH v2 5/5] audit: replace getname()/putname() hacks with reference counters
Quoted 11 lines · Paul Moore
In order to ensure that filenames are not released before the audit subsystem is done with the strings there are a number of hacks built into the fs and audit subsystems around
getname()andputname(). To say these hacks are "ugly" would be kind.This patch removes the filename hackery in favor of a more conventional reference count based approach. The diffstat below tells most of the story; lots of audit/fs specific code is replaced with a traditional reference count based approach that is easily understood, even by those not familiar with the audit and/or fs subsystems.
Quoted 3 lines
Noted change of bumping refcnt before passing back pointer to struct filename.
Quoted 358 lines
--- fs/namei.c | 29 +++++++------- include/linux/audit.h | 3 - include/linux/fs.h | 9 +--- kernel/audit.h | 17 +------- kernel/auditsc.c | 105 +++++-------------------------------------------- 5 files changed, 29 insertions(+), 134 deletions(-)fs/namei.c +14
-15@@ -117,15 +117,6 @@* POSIX.1 2.4: an empty pathname is invalid (ENOENT). * PATH_MAX includes the nul terminator --RR. */ -void final_putname (struct filename *name) -{ -if (name->separate) { -__putname (name->name); -kfree (name); - }else { -__putname (name); - } -}#define EMBEDDED_NAME_MAX (PATH_MAX - sizeof(struct filename))@@ -144,6 +135,7 @@ getname_flags(const char __user *filename, int flags, int *empty) result =__getname ();if (unlikely (!result))return ERR_PTR (-ENOMEM ); + result->refcnt =1 ;/* * First, try to embed the struct filename inside the names_cache @@ -178,6 +170,7 @@ recopy: } result->name = kname; result->separate = true; + result->refcnt =1 ; max =PATH_MAX ; goto recopy; }@@ -201,7 +194,7 @@ recopy:return result; error: -final_putname (result); +putname (result);return err; }@@ -242,19 +235,25 @@ getname_kernel(const char * filename)memcpy ((char *)result->name, filename, len); result->uptr =NULL ; result->aname =NULL ; + result->refcnt =1 ;audit_getname (result);return result; } -#ifdef CONFIG_AUDITSYSCALL void putname (struct filename *name) { -if (unlikely (!audit_dummy_context ())) -return audit_putname (name); -final_putname (name); +BUG_ON (name->refcnt <=0 ); + +if (--name->refcnt >0 ) +return ; + +if (name->separate) { +__putname (name->name); +kfree (name); + }else +__putname (name); } -#endif static int check_acl (struct inode *inode,int mask) {include/linux/audit.h +0
-3@@ -127,7 +127,6 @@ extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1,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_putname (struct filename *name);#define AUDIT_INODE_PARENT 1/* dentry represents the parent */ #define AUDIT_INODE_HIDDEN 2/* audit record should be hidden */ @@ -346,8 +345,6 @@ static inline struct filename *audit_reusename(const __user char *name) }static inline void audit_getname (struct filename *name) { } -static inline void audit_putname (struct filename *name) -{ }static inline void __audit_inode (struct filename *name,const struct dentry *dentry,unsigned int flags)include/linux/fs.h +2
-7@@ -2017,6 +2017,7 @@ struct filename {const char *name;/* pointer to actual string */ const __user char *uptr;/* original userland pointer */ struct audit_names *aname; +int refcnt;bool separate;/* should "name" be freed? */ };@@ -2036,6 +2037,7 @@ extern int filp_close(struct file *, fl_owner_t id);extern struct filename *getname (const char __user *);extern struct filename *getname_kernel (const char *); +extern void putname (struct filename *name);enum {FILE_CREATED =1 ,@@ -2056,15 +2058,8 @@ extern void __init vfs_caches_init(unsigned long);extern struct kmem_cache *names_cachep; -extern void final_putname (struct filename *name); -#define __getname () kmem_cache_alloc(names_cachep, GFP_KERNEL)#define __putname (name) kmem_cache_free(names_cachep, (void *)(name)) -#ifndef CONFIG_AUDITSYSCALL -#define putname (name) final_putname(name) -#else -extern void putname (struct filename *name); -#endif #ifdef CONFIG_BLOCK extern int register_blkdev (unsigned int ,const char *);kernel/audit.h +2
-15@@ -24,12 +24,6 @@#include <linux/skbuff.h> #include <uapi/linux/mqueue.h> -/* 0 = no checking -1 = put_count checking -2 = verbose put_count checking -*/ -#define AUDIT_DEBUG 0 -/* AUDIT_NAMES is the number of slots we reserve in the audit_context * for saving names from getname(). If we get more names we will allocate * a name dynamically and also add those to the list anchored by names_list. */ @@ -74,9 +68,8 @@ struct audit_cap_data { }; }; -/* When fs/namei.c:getname() is called, we store the pointer in name and -* we don't let putname() free it (instead we free all of the saved -* pointers at syscall exit time). +/* When fs/namei.c:getname() is called, we store the pointer in name and bump +* the refcnt in the associated filename struct. * * Further, in fs/namei.c:path_lookup() we store the inode and device. */ @@ -86,7 +79,6 @@ struct audit_names {struct filename *name;int name_len;/* number of chars to log */ bool hidden;/* don't log this record */ -bool name_put;/* call __putname()? */ unsigned long ino;dev_t dev;@@ -208,11 +200,6 @@ struct audit_context { };int fds[2 ];struct audit_proctitle proctitle; - -#if AUDIT_DEBUG -int put_count; -int ino_count; -#endif };extern u32 audit_ever_enabled;kernel/auditsc.c +10
-92@@ -866,33 +866,10 @@ static inline void audit_free_names(struct audit_context *context) {struct audit_names *n, *next; -#if AUDIT_DEBUG ==2 -if (context->put_count + context->ino_count != context->name_count) { -int i =0 ; - -pr_err ("%s:%d(:%d): major=%d in_syscall=%d" -" name_count=%d put_count=%d ino_count=%d" -" [NOT freeing]\n" , __FILE__, __LINE__, - context->serial, context->major, context->in_syscall, - context->name_count, context->put_count, - context->ino_count); -list_for_each_entry (n, &context->names_list, list) { -pr_err ("names[%d] = %p = %s\n" , i++, n->name, - n->name->name ?:"(null)" ); - } -dump_stack (); -return ; - } -#endif -#if AUDIT_DEBUG - context->put_count =0 ; - context->ino_count =0 ; -#endif -list_for_each_entry_safe (n, next, &context->names_list, list) {list_del (&n->list); -if (n->name && n->name_put) -final_putname (n->name); +if (n->name) +putname (n->name);if (n->should_free)kfree (n); }@@ -1711,9 +1688,6 @@ static struct audit_names *audit_alloc_name(struct audit_context *context,list_add_tail (&aname->list, &context->names_list); context->name_count++; -#if AUDIT_DEBUG - context->ino_count++; -#endif return aname; }@@ -1734,8 +1708,10 @@ __audit_reusename(const __user char *uptr)list_for_each_entry (n, &context->names_list, list) {if (!n->name)continue ; -if (n->name->uptr == uptr) +if (n->name->uptr == uptr) { + n->name->refcnt++;return n->name; + } }return NULL ; }@@ -1752,19 +1728,8 @@ void __audit_getname(struct filename *name)struct audit_context *context = current->audit_context;struct audit_names *n; -if (!context->in_syscall) { -#if AUDIT_DEBUG ==2 -pr_err ("%s:%d(:%d): ignoring getname(%p)\n" , - __FILE__, __LINE__, context->serial, name); -dump_stack (); -#endif +if (!context->in_syscall)return ; - } - -#if AUDIT_DEBUG -/* The filename _must_ have a populated ->name */ -BUG_ON (!name->name); -#endif n =audit_alloc_name (context,AUDIT_TYPE_UNKNOWN );if (!n)@@ -1772,56 +1737,13 @@ void __audit_getname(struct filename *name) n->name = name; n->name_len =AUDIT_NAME_FULL ; - n->name_put = true; name->aname = n; + name->refcnt++;if (!context->pwd.dentry)get_fs_pwd (current->fs, &context->pwd); } -/* audit_putname - intercept a putname request -* @name: name to intercept and delay for putname -* -* If we have stored the name from getname in the audit context, -* then we delay the putname until syscall exit. -* Called from include/linux/fs.h:putname(). -*/ -void audit_putname (struct filename *name) -{ -struct audit_context *context = current->audit_context; - -BUG_ON (!context); -if (!name->aname || !context->in_syscall) { -#if AUDIT_DEBUG ==2 -pr_err ("%s:%d(:%d): final_putname(%p)\n" , - __FILE__, __LINE__, context->serial, name); -if (context->name_count) { -struct audit_names *n; -int i =0 ; - -list_for_each_entry (n, &context->names_list, list) -pr_err ("name[%d] = %p = %s\n" , i++, n->name, - n->name->name ?:"(null)" ); - } -#endif -final_putname (name); - } -#if AUDIT_DEBUG - else { - ++context->put_count; -if (context->put_count > context->name_count) { -pr_err ("%s:%d(:%d): major=%d in_syscall=%d putname(%p)" -" name_count=%d put_count=%d\n" , - __FILE__, __LINE__, - context->serial, context->major, - context->in_syscall, name->name, - context->name_count, context->put_count); -dump_stack (); - } - } -#endif -} -/** * __audit_inode - store the inode and device from a lookup * @name: name being audited @@ -1842,11 +1764,6 @@ void __audit_inode(struct filename *name, const struct dentry *dentry,if (!name) goto out_alloc; -#if AUDIT_DEBUG -/* The struct filename _must_ have a populated ->name */ -BUG_ON (!name->name); -#endif -/* * If we have a pointer to an audit_names entry already, then we can * just use it directly if the type is correct. @@ -1893,9 +1810,10 @@ out_alloc: n =audit_alloc_name (context,AUDIT_TYPE_UNKNOWN );if (!n)return ; -if (name) -/* no need to set ->name_put as the original will cleanup */ +if (name) { n->name = name; + name->refcnt++; + } out:if (parent) {
kernel/auditsc.c void __audit_inode_child(const struct inode *parent, · line 1919
Quoted 9 lines
kernel/auditsc.c +1
-2@@ -1995,8 +1913,7 @@ void __audit_inode_child(const struct inode *parent,if (found_parent) { found_child->name = found_parent->name; found_child->name_len =AUDIT_NAME_FULL ; -/* don't call __putname() */ - found_child->name_put = false; + found_child->name->refcnt++; } }
- RGB
--
Richard Guy Briggs <[email protected]>
Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada
Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545
Re: [PATCH v2 5/5] audit: replace getname()/putname() hacks with reference counters
Quoted 12 lines · Richard Guy Briggs
Quoted 11 lines · Paul Moore
In order to ensure that filenames are not released before the audit subsystem is done with the strings there are a number of hacks built into the fs and audit subsystems around
getname()andputname(). To say these hacks are "ugly" would be kind.This patch removes the filename hackery in favor of a more conventional reference count based approach. The diffstat below tells most of the story; lots of audit/fs specific code is replaced with a traditional reference count based approach that is easily understood, even by those not familiar with the audit and/or fs subsystems.
Quoted 8 lines
Quoted 3 lines
Noted change of bumping refcnt before passing back pointer to struct filename.
Reviewed-by Richard Guy Briggs <[email protected]>
Thanks for taking another look at the patch set.
Signature · 2 lines
paul moore security @ redhat
Quoted 12 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
Quoted 9 lines
---
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
Thanks,
Guenter
Al Viro
maintainerQuoted 22 lines · Guenter Roeck
Quoted 12 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
Quoted 9 lines
---
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
Quoted 4 lines
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
FWIW, I've ported that on top of vfs.git#for-next; result is in vfs.git#experimental. Paul, are you OK with that one?
Quoted 24 lines · Al Viro
Quoted 23 lines · Guenter Roeck
Quoted 21 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
Quoted 7 lines
Quoted 4 lines
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
FWIW, I've ported that on top of vfs.git#for-next; result is in vfs.git#experimental. Paul, are you OK with that one?
Okay, hang on let me test that ...
Signature · 2 lines
paul moore security @ redhat
Quoted 28 lines · Paul Moore
Quoted 27 lines · Al Viro
Quoted 26 lines · Guenter Roeck
Quoted 14 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Quoted 8 lines
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference countersHi Paul,
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
FWIW, I've ported that on top of vfs.git#for-next; result is in vfs.git#experimental. Paul, are you OK with that one?
Okay, hang on let me test that ...
Your experimental branch looks good to me, thanks.
Signature · 2 lines
paul moore security @ redhat
Al Viro
maintainerQuoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
Al Viro
maintainerQuoted 7 lines · Al Viro
Quoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
OK, vfs.git#getname is it; it's in never-to-be-rebased mode and it's merged into vfs.git#for-next (as of right now; HEAD is 9ee4c4). If you need to do something on top of that stuff, pulling vfs.git#getname is safe.
Quoted 11 lines · Al Viro
Quoted 6 lines · Al Viro
Quoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
OK, vfs.git#getname is it; it's in never-to-be-rebased mode and it's merged into vfs.git#for-next (as of right now; HEAD is 9ee4c4). If you need to do something on top of that stuff, pulling vfs.git#getname is safe.
Great, thanks.
Signature · 2 lines
paul moore security @ redhat
Al Viro
maintainerQuoted 5 lines · Al Viro
Quoted 4 lines · Al Viro
Quoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Quoted 7 lines
Quoted 3 lines
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
OK, vfs.git#getname is it; it's in never-to-be-rebased mode and it's merged into vfs.git#for-next (as of right now; HEAD is 9ee4c4). If you need to do something on top of that stuff, pulling vfs.git#getname is safe.
Unfortunately, that thing was -rc2-based, leading to conflict with mainline in kernel/auditsc.c. My fault, I hadn't realized that "audit: create private file name copies when auditing inodes" in audit tree was, in fact, present in mainline. vfs.git#getname2 is -rc3-based, same resulting kernel/auditsc.c as in #getname. Please, use that. vfs.git#for-next merges from that one now, so tomorrow -next should have no problems from vfs.git...
Quoted 15 lines · Al Viro
Quoted 8 lines · Al Viro
Quoted 6 lines · Al Viro
Quoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
Quoted 5 lines
OK, vfs.git#getname is it; it's in never-to-be-rebased mode and it's merged
into vfs.git#for-next (as of right now; HEAD is 9ee4c4). If you need to do
something on top of that stuff, pulling vfs.git#getname is safe.
Quoted 7 lines
Unfortunately, that thing was -rc2-based, leading to conflict with mainline in
kernel/auditsc.c. My fault, I hadn't realized that "audit: create private file name copies when auditing inodes" in audit tree was, in fact, present in mainline. vfs.git#getname2 is -rc3-based, same resultingkernel/auditsc.cas in #getname. Please, use that. vfs.git#for-next merges from that one now, so tomorrow -next should have no problems from vfs.git...
No worries, thanks for the update.
Signature · 2 lines
paul moore security @ redhat
Quoted 14 lines · Al Viro
Quoted 5 lines · Al Viro
Quoted 4 lines · Al Viro
Quoted 1 line · Paul Moore
Your experimental branch looks good to me, thanks.
Quoted 7 lines
Quoted 3 lines
Pushed into for-next; I'm probably going to move that stuff into a never-rebased branch, merged into for-next and safe to pull into your tree if you want to do something on top of that set.
OK, vfs.git#getname is it; it's in never-to-be-rebased mode and it's merged into vfs.git#for-next (as of right now; HEAD is 9ee4c4). If you need to do something on top of that stuff, pulling vfs.git#getname is safe.
Quoted 7 lines
Unfortunately, that thing was -rc2-based, leading to conflict with mainline in
kernel/auditsc.c. My fault, I hadn't realized that "audit: create private file name copies when auditing inodes" in audit tree was, in fact, present in mainline. vfs.git#getname2 is -rc3-based, same resultingkernel/auditsc.cas in #getname. Please, use that. vfs.git#for-next merges from that one now, so tomorrow -next should have no problems from vfs.git...
I have tested vfs.git#getname2 on top of Linux v3.19-rc5-184-gc4e00f1 (plus block-loopmq patchset) and it boots fine on Ubuntu/precise amd64.
Just curious, where will this audit-filename-handling overhaul go through? Through Paul's audit-next or Al's vfs-next tree?
AFAICS, a new linux-next will be available on Monday (2015-01-26). I try to retest with this.
- Sedat -
Hi Sedat,
Quoted 3 lines · On Sat, 24 Jan 2015 10:03:06 +0100 Sedat Dilek <[email protected]> wrote:
AFAICS, a new linux-next will be available on Monday (2015-01-26). I try to retest with this.
Actually, Tuesday - Monday is a holiday here.
Signature · 2 lines
Cheers, Stephen Rothwell [email protected]
Quoted 3 lines · Sedat Dilek
I have tested vfs.git#getname2 on top of Linux v3.19-rc5-184-gc4e00f1 (plus block-loopmq patchset) and it boots fine on Ubuntu/precise amd64.
Great, thank you for the additional testing.
Quoted 2 lines
Just curious, where will this audit-filename-handling overhaul go through? Through Paul's audit-next or Al's vfs-next tree?
Al wanted to carry the patchset so that is where it lives now, you should see it arrive in Linus' tree via the VFS tree.
Signature · 2 lines
paul moore security @ redhat
Quoted 23 lines · Al Viro
Quoted 22 lines · Guenter Roeck
Quoted 21 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
Quoted 8 lines
Quoted 4 lines
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
FWIW, I've ported that on top of vfs.git#for-next; result is in vfs.git#experimental. Paul, are you OK with that one?
I also tested that one. Works as expected.
Thanks,
Guenter
Quoted 23 lines · Guenter Roeck
Quoted 14 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Quoted 7 lines
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference counters
Quoted 4 lines
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
This patchset currently lives, along with one other unrelated patch, in the audit next branch:
* git://git.infradead.org/users/pcmoore/audit
I'm currently testing these in combination with the patch Al posted last night. Assuming all goes well I'll drop them from the audit next branch and toss all six patches (these plus Al's) into another branch in case Al wants to pull them for the VFS tree.
Signature · 2 lines
paul moore security @ redhat
Guenter Roeck
Tested-byQuoted 32 lines · Paul Moore
Quoted 23 lines · Guenter Roeck
Quoted 14 lines · Paul Moore
This patchset has some important changes from the previous revision, namely a fix from Al Viro (included in 2/5) that resolves a boot panic on some systems as well as some smaller, less noteworthy fixes found in the linux-next announcement thread from January 20th (refcount bump in
__audit_reusename()and a inode type in__audit_inode()).This patchset still needs some additional testing to verify that the audit code still functions properly (the minor fixes mentioned above) and there is an additional patch from Al that should be included as well, but I wanted to post this and push the series to the audit next branch quickly since a number of folks were affected by the boot panic.
---
Quoted 7 lines
Paul Moore (5):
fs: reworkgetname_kernelto handle up toPATH_MAXsized filenames
fs: create proper filename objects usinggetname_kernel()
audit: enable filename recording viagetname_kernel()
audit: fix filename matching in__audit_inode()and__audit_inode_child()
audit: replace getname()/putname() hacks with reference countersQuoted 4 lines
Hi Paul,
What is the baseline for this patch set ? Obviously -next won't work, and it does not apply to mainline either.
This patchset currently lives, along with one other unrelated patch, in the audit next branch:
Quoted 7 lines
*
git://git.infradead.org/users/pcmoore/auditI'm currently testing these in combination with the patch Al posted last night. Assuming all goes well I'll drop them from the audit next branch and toss all six patches (these plus Al's) into another branch in case Al wants to pull them for the VFS tree.
The version in the audit next tree works with my qemu microblaze test, so feel free to add
Guenter