sanitize audit_mq_open()
PATCH 8/15 sanitize audit_mq_open()
* don't bother with allocations
* don't do double copy_from_user()
* don't duplicate parts of check for audit_dummy_context()
Signed-off-by Al Viro <[email protected]>
--- include/linux/audit.h | 9 +++---- ipc/mqueue.c | 23 ++++++++--------- kernel/auditsc.c | 65 +++++++++++++++++------------------------------- 3 files changed, 38 insertions(+), 59 deletions(-)
include/linux/audit.h +4 -5
@@ -448,7 +448,7 @@ extern void audit_socketcall(int nargs, unsigned long *args);extern int audit_sockaddr (int len,void *addr);extern int __audit_fd_pair (int fd1,int fd2);extern int audit_set_macxattr (const char *name); -extern int __audit_mq_open (int oflag,mode_t mode,struct mq_attr __user *u_attr); +extern void __audit_mq_open (int oflag,mode_t mode,struct mq_attr *attr);extern void __audit_mq_sendrecv (mqd_t mqdes,size_t msg_len,unsigned int msg_prio,const struct timespec *abs_timeout);extern void __audit_mq_notify (mqd_t mqdes,const struct sigevent *notification);extern void __audit_mq_getsetattr (mqd_t mqdes,struct mq_attr *mqstat);
@@ -469,11 +469,10 @@ static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gidif (unlikely (!audit_dummy_context ()))__audit_ipc_set_perm (qbytes, uid, gid, mode); } -static inline int audit_mq_open (int oflag,mode_t mode,struct mq_attr __user *u_attr) +static inline void audit_mq_open (int oflag,mode_t mode,struct mq_attr *attr) {if (unlikely (!audit_dummy_context ())) -return __audit_mq_open (oflag, mode, u_attr); -return 0 ; +__audit_mq_open (oflag, mode, attr); }static inline void audit_mq_sendrecv (mqd_t mqdes,size_t msg_len,unsigned int msg_prio,const struct timespec *abs_timeout) {
@@ -517,7 +516,7 @@ extern int audit_signals;#define audit_fd_pair (n,a) ({ 0; })#define audit_sockaddr (len, addr) ({ 0; })#define audit_set_macxattr (n) do { ; } while (0) -#define audit_mq_open (o,m,a) ({ 0; }) +#define audit_mq_open (o,m,a) ((void)0)#define audit_mq_sendrecv (d,l,p,t) ((void)0)#define audit_mq_notify (d,n) ((void)0)#define audit_mq_getsetattr (d,s) ((void)0)
ipc/mqueue.c +11 -12
@@ -588,21 +588,17 @@ static int mq_attr_ok(struct mq_attr *attr)* Invoked when creating a new queue via sys_mq_open */ static struct file *do_create (struct dentry *dir,struct dentry *dentry, -int oflag,mode_t mode,struct mq_attr __user *u_attr) +int oflag,mode_t mode,struct mq_attr *attr) { -struct mq_attr attr;struct file *result;int ret; -if (u_attr) { - ret = -EFAULT ; -if (copy_from_user (&attr, u_attr,sizeof (attr))) - goto out; +if (attr) { ret = -EINVAL ; -if (!mq_attr_ok (&attr)) +if (!mq_attr_ok (attr)) goto out;/* store for use during create */ - dentry->d_fsdata = &attr; + dentry->d_fsdata = attr; } mode &= ~current->fs->umask;
@@ -657,11 +653,13 @@ asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode,struct dentry *dentry;struct file *filp;char *name; +struct mq_attr attr;int fd, error; - error =audit_mq_open (oflag, mode, u_attr); -if (error !=0 ) -return error; +if (u_attr &©_from_user (&attr, u_attr,sizeof (struct mq_attr ))) +return -EFAULT ; + +audit_mq_open (oflag, mode, u_attr ? &attr :NULL );if (IS_ERR (name =getname (u_name)))return PTR_ERR (name);
@@ -687,7 +685,8 @@ asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode, filp =do_open (dentry, oflag); }else { filp =do_create (mqueue_mnt->mnt_root, dentry, - oflag, mode, u_attr); + oflag, mode, + u_attr ? &attr :NULL ); } }else { error = -ENOENT ;
kernel/auditsc.c +23 -42
101 lines not on this page · raw message
Signature · 1 line
1.5.6.5
Quoted 6 lines · Al Viro
* don't bother with allocations
* don't do doublecopy_from_user()
* don't duplicate parts of check foraudit_dummy_context()Signed-off-by Al Viro <[email protected]>
Reviewed-by James Morris <[email protected]>
Signature · 2 lines
James Morris <[email protected]>