diff options
Diffstat (limited to 'ipc/mqueue.c')
| -rw-r--r-- | ipc/mqueue.c | 19 | 
1 files changed, 11 insertions, 8 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 68eb857cfdea..d9393f8e4c3e 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -112,13 +112,14 @@ static inline struct mqueue_inode_info *MQUEUE_I(struct inode *inode)  static struct inode *mqueue_get_inode(struct super_block *sb, int mode,  							struct mq_attr *attr)  { +	struct user_struct *u = current_user();  	struct inode *inode;  	inode = new_inode(sb);  	if (inode) {  		inode->i_mode = mode; -		inode->i_uid = current->fsuid; -		inode->i_gid = current->fsgid; +		inode->i_uid = current_fsuid(); +		inode->i_gid = current_fsgid();  		inode->i_blocks = 0;  		inode->i_mtime = inode->i_ctime = inode->i_atime =  				CURRENT_TIME; @@ -126,7 +127,6 @@ static struct inode *mqueue_get_inode(struct super_block *sb, int mode,  		if (S_ISREG(mode)) {  			struct mqueue_inode_info *info;  			struct task_struct *p = current; -			struct user_struct *u = p->user;  			unsigned long mq_bytes, mq_msg_tblsz;  			inode->i_fop = &mqueue_file_operations; @@ -507,7 +507,7 @@ static void __do_notify(struct mqueue_inode_info *info)  			sig_i.si_code = SI_MESGQ;  			sig_i.si_value = info->notify.sigev_value;  			sig_i.si_pid = task_tgid_vnr(current); -			sig_i.si_uid = current->uid; +			sig_i.si_uid = current_uid();  			kill_pid_info(info->notify.sigev_signo,  				      &sig_i, info->notify_owner); @@ -594,6 +594,7 @@ static int mq_attr_ok(struct mq_attr *attr)  static struct file *do_create(struct dentry *dir, struct dentry *dentry,  			int oflag, mode_t mode, struct mq_attr __user *u_attr)  { +	const struct cred *cred = current_cred();  	struct mq_attr attr;  	struct file *result;  	int ret; @@ -618,7 +619,7 @@ static struct file *do_create(struct dentry *dir, struct dentry *dentry,  	if (ret)  		goto out_drop_write; -	result = dentry_open(dentry, mqueue_mnt, oflag); +	result = dentry_open(dentry, mqueue_mnt, oflag, cred);  	/*  	 * dentry_open() took a persistent mnt_want_write(),  	 * so we can now drop this one. @@ -637,8 +638,10 @@ out:  /* Opens existing queue */  static struct file *do_open(struct dentry *dentry, int oflag)  { -static int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE, -					MAY_READ | MAY_WRITE }; +	const struct cred *cred = current_cred(); + +	static const int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE, +						  MAY_READ | MAY_WRITE };  	if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) {  		dput(dentry); @@ -652,7 +655,7 @@ static int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,  		return ERR_PTR(-EACCES);  	} -	return dentry_open(dentry, mqueue_mnt, oflag); +	return dentry_open(dentry, mqueue_mnt, oflag, cred);  }  asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode,  | 
