diff options
Diffstat (limited to 'ipc/mqueue.c')
| -rw-r--r-- | ipc/mqueue.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 9a142a29074..9b7c8ab7d75 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -32,6 +32,7 @@  #include <linux/nsproxy.h>  #include <linux/pid.h>  #include <linux/ipc_namespace.h> +#include <linux/user_namespace.h>  #include <linux/slab.h>  #include <net/sock.h> @@ -542,9 +543,13 @@ static void __do_notify(struct mqueue_inode_info *info)  			sig_i.si_errno = 0;  			sig_i.si_code = SI_MESGQ;  			sig_i.si_value = info->notify.sigev_value; +			/* map current pid/uid into info->owner's namespaces */ +			rcu_read_lock();  			sig_i.si_pid = task_tgid_nr_ns(current,  						ns_of_pid(info->notify_owner)); -			sig_i.si_uid = current_uid(); +			sig_i.si_uid = user_ns_map_uid(info->user->user_ns, +						current_cred(), current_uid()); +			rcu_read_unlock();  			kill_pid_info(info->notify.sigev_signo,  				      &sig_i, info->notify_owner);  |