]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - ipc/msg.c
ipc/msg: avoid ipc_rcu_alloc()
[karo-tx-linux.git] / ipc / msg.c
1 /*
2  * linux/ipc/msg.c
3  * Copyright (C) 1992 Krishna Balasubramanian
4  *
5  * Removed all the remaining kerneld mess
6  * Catch the -EFAULT stuff properly
7  * Use GFP_KERNEL for messages as in 1.2
8  * Fixed up the unchecked user space derefs
9  * Copyright (C) 1998 Alan Cox & Andi Kleen
10  *
11  * /proc/sysvipc/msg support (c) 1999 Dragos Acostachioaie <dragos@iname.com>
12  *
13  * mostly rewritten, threaded and wake-one semantics added
14  * MSGMAX limit removed, sysctl's added
15  * (c) 1999 Manfred Spraul <manfred@colorfullife.com>
16  *
17  * support for audit of ipc object properties and permission changes
18  * Dustin Kirkland <dustin.kirkland@us.ibm.com>
19  *
20  * namespaces support
21  * OpenVZ, SWsoft Inc.
22  * Pavel Emelianov <xemul@openvz.org>
23  */
24
25 #include <linux/capability.h>
26 #include <linux/msg.h>
27 #include <linux/spinlock.h>
28 #include <linux/init.h>
29 #include <linux/mm.h>
30 #include <linux/proc_fs.h>
31 #include <linux/list.h>
32 #include <linux/security.h>
33 #include <linux/sched/wake_q.h>
34 #include <linux/syscalls.h>
35 #include <linux/audit.h>
36 #include <linux/seq_file.h>
37 #include <linux/rwsem.h>
38 #include <linux/nsproxy.h>
39 #include <linux/ipc_namespace.h>
40
41 #include <asm/current.h>
42 #include <linux/uaccess.h>
43 #include "util.h"
44
45 /* one msg_receiver structure for each sleeping receiver */
46 struct msg_receiver {
47         struct list_head        r_list;
48         struct task_struct      *r_tsk;
49
50         int                     r_mode;
51         long                    r_msgtype;
52         long                    r_maxsize;
53
54         struct msg_msg          *r_msg;
55 };
56
57 /* one msg_sender for each sleeping sender */
58 struct msg_sender {
59         struct list_head        list;
60         struct task_struct      *tsk;
61         size_t                  msgsz;
62 };
63
64 #define SEARCH_ANY              1
65 #define SEARCH_EQUAL            2
66 #define SEARCH_NOTEQUAL         3
67 #define SEARCH_LESSEQUAL        4
68 #define SEARCH_NUMBER           5
69
70 #define msg_ids(ns)     ((ns)->ids[IPC_MSG_IDS])
71
72 static inline struct msg_queue *msq_obtain_object(struct ipc_namespace *ns, int id)
73 {
74         struct kern_ipc_perm *ipcp = ipc_obtain_object_idr(&msg_ids(ns), id);
75
76         if (IS_ERR(ipcp))
77                 return ERR_CAST(ipcp);
78
79         return container_of(ipcp, struct msg_queue, q_perm);
80 }
81
82 static inline struct msg_queue *msq_obtain_object_check(struct ipc_namespace *ns,
83                                                         int id)
84 {
85         struct kern_ipc_perm *ipcp = ipc_obtain_object_check(&msg_ids(ns), id);
86
87         if (IS_ERR(ipcp))
88                 return ERR_CAST(ipcp);
89
90         return container_of(ipcp, struct msg_queue, q_perm);
91 }
92
93 static inline void msg_rmid(struct ipc_namespace *ns, struct msg_queue *s)
94 {
95         ipc_rmid(&msg_ids(ns), &s->q_perm);
96 }
97
98 static void __msg_free(struct msg_queue *msq)
99 {
100         kvfree(msq);
101 }
102
103 static void msg_rcu_free(struct rcu_head *head)
104 {
105         struct kern_ipc_perm *p = container_of(head, struct kern_ipc_perm, rcu);
106         struct msg_queue *msq = container_of(p, struct msg_queue, q_perm);
107
108         security_msg_queue_free(msq);
109         __msg_free(msq);
110 }
111
112 static struct msg_queue *msg_alloc(void)
113 {
114         struct msg_queue *msq;
115
116         msq = kvmalloc(sizeof(*msq), GFP_KERNEL);
117         if (unlikely(!msq))
118                 return NULL;
119
120         atomic_set(&msq->q_perm.refcount, 1);
121
122         return msq;
123 }
124
125 /**
126  * newque - Create a new msg queue
127  * @ns: namespace
128  * @params: ptr to the structure that contains the key and msgflg
129  *
130  * Called with msg_ids.rwsem held (writer)
131  */
132 static int newque(struct ipc_namespace *ns, struct ipc_params *params)
133 {
134         struct msg_queue *msq;
135         int id, retval;
136         key_t key = params->key;
137         int msgflg = params->flg;
138
139         msq = msg_alloc();
140         if (!msq)
141                 return -ENOMEM;
142
143         msq->q_perm.mode = msgflg & S_IRWXUGO;
144         msq->q_perm.key = key;
145
146         msq->q_perm.security = NULL;
147         retval = security_msg_queue_alloc(msq);
148         if (retval) {
149                 __msg_free(msq);
150                 return retval;
151         }
152
153         msq->q_stime = msq->q_rtime = 0;
154         msq->q_ctime = get_seconds();
155         msq->q_cbytes = msq->q_qnum = 0;
156         msq->q_qbytes = ns->msg_ctlmnb;
157         msq->q_lspid = msq->q_lrpid = 0;
158         INIT_LIST_HEAD(&msq->q_messages);
159         INIT_LIST_HEAD(&msq->q_receivers);
160         INIT_LIST_HEAD(&msq->q_senders);
161
162         /* ipc_addid() locks msq upon success. */
163         id = ipc_addid(&msg_ids(ns), &msq->q_perm, ns->msg_ctlmni);
164         if (id < 0) {
165                 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
166                 return id;
167         }
168
169         ipc_unlock_object(&msq->q_perm);
170         rcu_read_unlock();
171
172         return msq->q_perm.id;
173 }
174
175 static inline bool msg_fits_inqueue(struct msg_queue *msq, size_t msgsz)
176 {
177         return msgsz + msq->q_cbytes <= msq->q_qbytes &&
178                 1 + msq->q_qnum <= msq->q_qbytes;
179 }
180
181 static inline void ss_add(struct msg_queue *msq,
182                           struct msg_sender *mss, size_t msgsz)
183 {
184         mss->tsk = current;
185         mss->msgsz = msgsz;
186         __set_current_state(TASK_INTERRUPTIBLE);
187         list_add_tail(&mss->list, &msq->q_senders);
188 }
189
190 static inline void ss_del(struct msg_sender *mss)
191 {
192         if (mss->list.next)
193                 list_del(&mss->list);
194 }
195
196 static void ss_wakeup(struct msg_queue *msq,
197                       struct wake_q_head *wake_q, bool kill)
198 {
199         struct msg_sender *mss, *t;
200         struct task_struct *stop_tsk = NULL;
201         struct list_head *h = &msq->q_senders;
202
203         list_for_each_entry_safe(mss, t, h, list) {
204                 if (kill)
205                         mss->list.next = NULL;
206
207                 /*
208                  * Stop at the first task we don't wakeup,
209                  * we've already iterated the original
210                  * sender queue.
211                  */
212                 else if (stop_tsk == mss->tsk)
213                         break;
214                 /*
215                  * We are not in an EIDRM scenario here, therefore
216                  * verify that we really need to wakeup the task.
217                  * To maintain current semantics and wakeup order,
218                  * move the sender to the tail on behalf of the
219                  * blocked task.
220                  */
221                 else if (!msg_fits_inqueue(msq, mss->msgsz)) {
222                         if (!stop_tsk)
223                                 stop_tsk = mss->tsk;
224
225                         list_move_tail(&mss->list, &msq->q_senders);
226                         continue;
227                 }
228
229                 wake_q_add(wake_q, mss->tsk);
230         }
231 }
232
233 static void expunge_all(struct msg_queue *msq, int res,
234                         struct wake_q_head *wake_q)
235 {
236         struct msg_receiver *msr, *t;
237
238         list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
239                 wake_q_add(wake_q, msr->r_tsk);
240                 WRITE_ONCE(msr->r_msg, ERR_PTR(res));
241         }
242 }
243
244 /*
245  * freeque() wakes up waiters on the sender and receiver waiting queue,
246  * removes the message queue from message queue ID IDR, and cleans up all the
247  * messages associated with this queue.
248  *
249  * msg_ids.rwsem (writer) and the spinlock for this message queue are held
250  * before freeque() is called. msg_ids.rwsem remains locked on exit.
251  */
252 static void freeque(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
253 {
254         struct msg_msg *msg, *t;
255         struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
256         DEFINE_WAKE_Q(wake_q);
257
258         expunge_all(msq, -EIDRM, &wake_q);
259         ss_wakeup(msq, &wake_q, true);
260         msg_rmid(ns, msq);
261         ipc_unlock_object(&msq->q_perm);
262         wake_up_q(&wake_q);
263         rcu_read_unlock();
264
265         list_for_each_entry_safe(msg, t, &msq->q_messages, m_list) {
266                 atomic_dec(&ns->msg_hdrs);
267                 free_msg(msg);
268         }
269         atomic_sub(msq->q_cbytes, &ns->msg_bytes);
270         ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
271 }
272
273 /*
274  * Called with msg_ids.rwsem and ipcp locked.
275  */
276 static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
277 {
278         struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
279
280         return security_msg_queue_associate(msq, msgflg);
281 }
282
283 SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
284 {
285         struct ipc_namespace *ns;
286         static const struct ipc_ops msg_ops = {
287                 .getnew = newque,
288                 .associate = msg_security,
289         };
290         struct ipc_params msg_params;
291
292         ns = current->nsproxy->ipc_ns;
293
294         msg_params.key = key;
295         msg_params.flg = msgflg;
296
297         return ipcget(ns, &msg_ids(ns), &msg_ops, &msg_params);
298 }
299
300 static inline unsigned long
301 copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
302 {
303         switch (version) {
304         case IPC_64:
305                 return copy_to_user(buf, in, sizeof(*in));
306         case IPC_OLD:
307         {
308                 struct msqid_ds out;
309
310                 memset(&out, 0, sizeof(out));
311
312                 ipc64_perm_to_ipc_perm(&in->msg_perm, &out.msg_perm);
313
314                 out.msg_stime           = in->msg_stime;
315                 out.msg_rtime           = in->msg_rtime;
316                 out.msg_ctime           = in->msg_ctime;
317
318                 if (in->msg_cbytes > USHRT_MAX)
319                         out.msg_cbytes  = USHRT_MAX;
320                 else
321                         out.msg_cbytes  = in->msg_cbytes;
322                 out.msg_lcbytes         = in->msg_cbytes;
323
324                 if (in->msg_qnum > USHRT_MAX)
325                         out.msg_qnum    = USHRT_MAX;
326                 else
327                         out.msg_qnum    = in->msg_qnum;
328
329                 if (in->msg_qbytes > USHRT_MAX)
330                         out.msg_qbytes  = USHRT_MAX;
331                 else
332                         out.msg_qbytes  = in->msg_qbytes;
333                 out.msg_lqbytes         = in->msg_qbytes;
334
335                 out.msg_lspid           = in->msg_lspid;
336                 out.msg_lrpid           = in->msg_lrpid;
337
338                 return copy_to_user(buf, &out, sizeof(out));
339         }
340         default:
341                 return -EINVAL;
342         }
343 }
344
345 static inline unsigned long
346 copy_msqid_from_user(struct msqid64_ds *out, void __user *buf, int version)
347 {
348         switch (version) {
349         case IPC_64:
350                 if (copy_from_user(out, buf, sizeof(*out)))
351                         return -EFAULT;
352                 return 0;
353         case IPC_OLD:
354         {
355                 struct msqid_ds tbuf_old;
356
357                 if (copy_from_user(&tbuf_old, buf, sizeof(tbuf_old)))
358                         return -EFAULT;
359
360                 out->msg_perm.uid       = tbuf_old.msg_perm.uid;
361                 out->msg_perm.gid       = tbuf_old.msg_perm.gid;
362                 out->msg_perm.mode      = tbuf_old.msg_perm.mode;
363
364                 if (tbuf_old.msg_qbytes == 0)
365                         out->msg_qbytes = tbuf_old.msg_lqbytes;
366                 else
367                         out->msg_qbytes = tbuf_old.msg_qbytes;
368
369                 return 0;
370         }
371         default:
372                 return -EINVAL;
373         }
374 }
375
376 /*
377  * This function handles some msgctl commands which require the rwsem
378  * to be held in write mode.
379  * NOTE: no locks must be held, the rwsem is taken inside this function.
380  */
381 static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
382                        struct msqid_ds __user *buf, int version)
383 {
384         struct kern_ipc_perm *ipcp;
385         struct msqid64_ds uninitialized_var(msqid64);
386         struct msg_queue *msq;
387         int err;
388
389         if (cmd == IPC_SET) {
390                 if (copy_msqid_from_user(&msqid64, buf, version))
391                         return -EFAULT;
392         }
393
394         down_write(&msg_ids(ns).rwsem);
395         rcu_read_lock();
396
397         ipcp = ipcctl_pre_down_nolock(ns, &msg_ids(ns), msqid, cmd,
398                                       &msqid64.msg_perm, msqid64.msg_qbytes);
399         if (IS_ERR(ipcp)) {
400                 err = PTR_ERR(ipcp);
401                 goto out_unlock1;
402         }
403
404         msq = container_of(ipcp, struct msg_queue, q_perm);
405
406         err = security_msg_queue_msgctl(msq, cmd);
407         if (err)
408                 goto out_unlock1;
409
410         switch (cmd) {
411         case IPC_RMID:
412                 ipc_lock_object(&msq->q_perm);
413                 /* freeque unlocks the ipc object and rcu */
414                 freeque(ns, ipcp);
415                 goto out_up;
416         case IPC_SET:
417         {
418                 DEFINE_WAKE_Q(wake_q);
419
420                 if (msqid64.msg_qbytes > ns->msg_ctlmnb &&
421                     !capable(CAP_SYS_RESOURCE)) {
422                         err = -EPERM;
423                         goto out_unlock1;
424                 }
425
426                 ipc_lock_object(&msq->q_perm);
427                 err = ipc_update_perm(&msqid64.msg_perm, ipcp);
428                 if (err)
429                         goto out_unlock0;
430
431                 msq->q_qbytes = msqid64.msg_qbytes;
432
433                 msq->q_ctime = get_seconds();
434                 /*
435                  * Sleeping receivers might be excluded by
436                  * stricter permissions.
437                  */
438                 expunge_all(msq, -EAGAIN, &wake_q);
439                 /*
440                  * Sleeping senders might be able to send
441                  * due to a larger queue size.
442                  */
443                 ss_wakeup(msq, &wake_q, false);
444                 ipc_unlock_object(&msq->q_perm);
445                 wake_up_q(&wake_q);
446
447                 goto out_unlock1;
448         }
449         default:
450                 err = -EINVAL;
451                 goto out_unlock1;
452         }
453
454 out_unlock0:
455         ipc_unlock_object(&msq->q_perm);
456 out_unlock1:
457         rcu_read_unlock();
458 out_up:
459         up_write(&msg_ids(ns).rwsem);
460         return err;
461 }
462
463 static int msgctl_nolock(struct ipc_namespace *ns, int msqid,
464                          int cmd, int version, void __user *buf)
465 {
466         int err;
467         struct msg_queue *msq;
468
469         switch (cmd) {
470         case IPC_INFO:
471         case MSG_INFO:
472         {
473                 struct msginfo msginfo;
474                 int max_id;
475
476                 if (!buf)
477                         return -EFAULT;
478
479                 /*
480                  * We must not return kernel stack data.
481                  * due to padding, it's not enough
482                  * to set all member fields.
483                  */
484                 err = security_msg_queue_msgctl(NULL, cmd);
485                 if (err)
486                         return err;
487
488                 memset(&msginfo, 0, sizeof(msginfo));
489                 msginfo.msgmni = ns->msg_ctlmni;
490                 msginfo.msgmax = ns->msg_ctlmax;
491                 msginfo.msgmnb = ns->msg_ctlmnb;
492                 msginfo.msgssz = MSGSSZ;
493                 msginfo.msgseg = MSGSEG;
494                 down_read(&msg_ids(ns).rwsem);
495                 if (cmd == MSG_INFO) {
496                         msginfo.msgpool = msg_ids(ns).in_use;
497                         msginfo.msgmap = atomic_read(&ns->msg_hdrs);
498                         msginfo.msgtql = atomic_read(&ns->msg_bytes);
499                 } else {
500                         msginfo.msgmap = MSGMAP;
501                         msginfo.msgpool = MSGPOOL;
502                         msginfo.msgtql = MSGTQL;
503                 }
504                 max_id = ipc_get_maxid(&msg_ids(ns));
505                 up_read(&msg_ids(ns).rwsem);
506                 if (copy_to_user(buf, &msginfo, sizeof(struct msginfo)))
507                         return -EFAULT;
508                 return (max_id < 0) ? 0 : max_id;
509         }
510
511         case MSG_STAT:
512         case IPC_STAT:
513         {
514                 struct msqid64_ds tbuf;
515                 int success_return;
516
517                 if (!buf)
518                         return -EFAULT;
519
520                 memset(&tbuf, 0, sizeof(tbuf));
521
522                 rcu_read_lock();
523                 if (cmd == MSG_STAT) {
524                         msq = msq_obtain_object(ns, msqid);
525                         if (IS_ERR(msq)) {
526                                 err = PTR_ERR(msq);
527                                 goto out_unlock;
528                         }
529                         success_return = msq->q_perm.id;
530                 } else {
531                         msq = msq_obtain_object_check(ns, msqid);
532                         if (IS_ERR(msq)) {
533                                 err = PTR_ERR(msq);
534                                 goto out_unlock;
535                         }
536                         success_return = 0;
537                 }
538
539                 err = -EACCES;
540                 if (ipcperms(ns, &msq->q_perm, S_IRUGO))
541                         goto out_unlock;
542
543                 err = security_msg_queue_msgctl(msq, cmd);
544                 if (err)
545                         goto out_unlock;
546
547                 kernel_to_ipc64_perm(&msq->q_perm, &tbuf.msg_perm);
548                 tbuf.msg_stime  = msq->q_stime;
549                 tbuf.msg_rtime  = msq->q_rtime;
550                 tbuf.msg_ctime  = msq->q_ctime;
551                 tbuf.msg_cbytes = msq->q_cbytes;
552                 tbuf.msg_qnum   = msq->q_qnum;
553                 tbuf.msg_qbytes = msq->q_qbytes;
554                 tbuf.msg_lspid  = msq->q_lspid;
555                 tbuf.msg_lrpid  = msq->q_lrpid;
556                 rcu_read_unlock();
557
558                 if (copy_msqid_to_user(buf, &tbuf, version))
559                         return -EFAULT;
560                 return success_return;
561         }
562
563         default:
564                 return -EINVAL;
565         }
566
567         return err;
568 out_unlock:
569         rcu_read_unlock();
570         return err;
571 }
572
573 SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
574 {
575         int version;
576         struct ipc_namespace *ns;
577
578         if (msqid < 0 || cmd < 0)
579                 return -EINVAL;
580
581         version = ipc_parse_version(&cmd);
582         ns = current->nsproxy->ipc_ns;
583
584         switch (cmd) {
585         case IPC_INFO:
586         case MSG_INFO:
587         case MSG_STAT:  /* msqid is an index rather than a msg queue id */
588         case IPC_STAT:
589                 return msgctl_nolock(ns, msqid, cmd, version, buf);
590         case IPC_SET:
591         case IPC_RMID:
592                 return msgctl_down(ns, msqid, cmd, buf, version);
593         default:
594                 return  -EINVAL;
595         }
596 }
597
598 static int testmsg(struct msg_msg *msg, long type, int mode)
599 {
600         switch (mode) {
601         case SEARCH_ANY:
602         case SEARCH_NUMBER:
603                 return 1;
604         case SEARCH_LESSEQUAL:
605                 if (msg->m_type <= type)
606                         return 1;
607                 break;
608         case SEARCH_EQUAL:
609                 if (msg->m_type == type)
610                         return 1;
611                 break;
612         case SEARCH_NOTEQUAL:
613                 if (msg->m_type != type)
614                         return 1;
615                 break;
616         }
617         return 0;
618 }
619
620 static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
621                                  struct wake_q_head *wake_q)
622 {
623         struct msg_receiver *msr, *t;
624
625         list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
626                 if (testmsg(msg, msr->r_msgtype, msr->r_mode) &&
627                     !security_msg_queue_msgrcv(msq, msg, msr->r_tsk,
628                                                msr->r_msgtype, msr->r_mode)) {
629
630                         list_del(&msr->r_list);
631                         if (msr->r_maxsize < msg->m_ts) {
632                                 wake_q_add(wake_q, msr->r_tsk);
633                                 WRITE_ONCE(msr->r_msg, ERR_PTR(-E2BIG));
634                         } else {
635                                 msq->q_lrpid = task_pid_vnr(msr->r_tsk);
636                                 msq->q_rtime = get_seconds();
637
638                                 wake_q_add(wake_q, msr->r_tsk);
639                                 WRITE_ONCE(msr->r_msg, msg);
640                                 return 1;
641                         }
642                 }
643         }
644
645         return 0;
646 }
647
648 long do_msgsnd(int msqid, long mtype, void __user *mtext,
649                 size_t msgsz, int msgflg)
650 {
651         struct msg_queue *msq;
652         struct msg_msg *msg;
653         int err;
654         struct ipc_namespace *ns;
655         DEFINE_WAKE_Q(wake_q);
656
657         ns = current->nsproxy->ipc_ns;
658
659         if (msgsz > ns->msg_ctlmax || (long) msgsz < 0 || msqid < 0)
660                 return -EINVAL;
661         if (mtype < 1)
662                 return -EINVAL;
663
664         msg = load_msg(mtext, msgsz);
665         if (IS_ERR(msg))
666                 return PTR_ERR(msg);
667
668         msg->m_type = mtype;
669         msg->m_ts = msgsz;
670
671         rcu_read_lock();
672         msq = msq_obtain_object_check(ns, msqid);
673         if (IS_ERR(msq)) {
674                 err = PTR_ERR(msq);
675                 goto out_unlock1;
676         }
677
678         ipc_lock_object(&msq->q_perm);
679
680         for (;;) {
681                 struct msg_sender s;
682
683                 err = -EACCES;
684                 if (ipcperms(ns, &msq->q_perm, S_IWUGO))
685                         goto out_unlock0;
686
687                 /* raced with RMID? */
688                 if (!ipc_valid_object(&msq->q_perm)) {
689                         err = -EIDRM;
690                         goto out_unlock0;
691                 }
692
693                 err = security_msg_queue_msgsnd(msq, msg, msgflg);
694                 if (err)
695                         goto out_unlock0;
696
697                 if (msg_fits_inqueue(msq, msgsz))
698                         break;
699
700                 /* queue full, wait: */
701                 if (msgflg & IPC_NOWAIT) {
702                         err = -EAGAIN;
703                         goto out_unlock0;
704                 }
705
706                 /* enqueue the sender and prepare to block */
707                 ss_add(msq, &s, msgsz);
708
709                 if (!ipc_rcu_getref(&msq->q_perm)) {
710                         err = -EIDRM;
711                         goto out_unlock0;
712                 }
713
714                 ipc_unlock_object(&msq->q_perm);
715                 rcu_read_unlock();
716                 schedule();
717
718                 rcu_read_lock();
719                 ipc_lock_object(&msq->q_perm);
720
721                 ipc_rcu_putref(&msq->q_perm, msg_rcu_free);
722                 /* raced with RMID? */
723                 if (!ipc_valid_object(&msq->q_perm)) {
724                         err = -EIDRM;
725                         goto out_unlock0;
726                 }
727                 ss_del(&s);
728
729                 if (signal_pending(current)) {
730                         err = -ERESTARTNOHAND;
731                         goto out_unlock0;
732                 }
733
734         }
735
736         msq->q_lspid = task_tgid_vnr(current);
737         msq->q_stime = get_seconds();
738
739         if (!pipelined_send(msq, msg, &wake_q)) {
740                 /* no one is waiting for this message, enqueue it */
741                 list_add_tail(&msg->m_list, &msq->q_messages);
742                 msq->q_cbytes += msgsz;
743                 msq->q_qnum++;
744                 atomic_add(msgsz, &ns->msg_bytes);
745                 atomic_inc(&ns->msg_hdrs);
746         }
747
748         err = 0;
749         msg = NULL;
750
751 out_unlock0:
752         ipc_unlock_object(&msq->q_perm);
753         wake_up_q(&wake_q);
754 out_unlock1:
755         rcu_read_unlock();
756         if (msg != NULL)
757                 free_msg(msg);
758         return err;
759 }
760
761 SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
762                 int, msgflg)
763 {
764         long mtype;
765
766         if (get_user(mtype, &msgp->mtype))
767                 return -EFAULT;
768         return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
769 }
770
771 static inline int convert_mode(long *msgtyp, int msgflg)
772 {
773         if (msgflg & MSG_COPY)
774                 return SEARCH_NUMBER;
775         /*
776          *  find message of correct type.
777          *  msgtyp = 0 => get first.
778          *  msgtyp > 0 => get first message of matching type.
779          *  msgtyp < 0 => get message with least type must be < abs(msgtype).
780          */
781         if (*msgtyp == 0)
782                 return SEARCH_ANY;
783         if (*msgtyp < 0) {
784                 if (*msgtyp == LONG_MIN) /* -LONG_MIN is undefined */
785                         *msgtyp = LONG_MAX;
786                 else
787                         *msgtyp = -*msgtyp;
788                 return SEARCH_LESSEQUAL;
789         }
790         if (msgflg & MSG_EXCEPT)
791                 return SEARCH_NOTEQUAL;
792         return SEARCH_EQUAL;
793 }
794
795 static long do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
796 {
797         struct msgbuf __user *msgp = dest;
798         size_t msgsz;
799
800         if (put_user(msg->m_type, &msgp->mtype))
801                 return -EFAULT;
802
803         msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
804         if (store_msg(msgp->mtext, msg, msgsz))
805                 return -EFAULT;
806         return msgsz;
807 }
808
809 #ifdef CONFIG_CHECKPOINT_RESTORE
810 /*
811  * This function creates new kernel message structure, large enough to store
812  * bufsz message bytes.
813  */
814 static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz)
815 {
816         struct msg_msg *copy;
817
818         /*
819          * Create dummy message to copy real message to.
820          */
821         copy = load_msg(buf, bufsz);
822         if (!IS_ERR(copy))
823                 copy->m_ts = bufsz;
824         return copy;
825 }
826
827 static inline void free_copy(struct msg_msg *copy)
828 {
829         if (copy)
830                 free_msg(copy);
831 }
832 #else
833 static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz)
834 {
835         return ERR_PTR(-ENOSYS);
836 }
837
838 static inline void free_copy(struct msg_msg *copy)
839 {
840 }
841 #endif
842
843 static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
844 {
845         struct msg_msg *msg, *found = NULL;
846         long count = 0;
847
848         list_for_each_entry(msg, &msq->q_messages, m_list) {
849                 if (testmsg(msg, *msgtyp, mode) &&
850                     !security_msg_queue_msgrcv(msq, msg, current,
851                                                *msgtyp, mode)) {
852                         if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) {
853                                 *msgtyp = msg->m_type - 1;
854                                 found = msg;
855                         } else if (mode == SEARCH_NUMBER) {
856                                 if (*msgtyp == count)
857                                         return msg;
858                         } else
859                                 return msg;
860                         count++;
861                 }
862         }
863
864         return found ?: ERR_PTR(-EAGAIN);
865 }
866
867 long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
868                long (*msg_handler)(void __user *, struct msg_msg *, size_t))
869 {
870         int mode;
871         struct msg_queue *msq;
872         struct ipc_namespace *ns;
873         struct msg_msg *msg, *copy = NULL;
874         DEFINE_WAKE_Q(wake_q);
875
876         ns = current->nsproxy->ipc_ns;
877
878         if (msqid < 0 || (long) bufsz < 0)
879                 return -EINVAL;
880
881         if (msgflg & MSG_COPY) {
882                 if ((msgflg & MSG_EXCEPT) || !(msgflg & IPC_NOWAIT))
883                         return -EINVAL;
884                 copy = prepare_copy(buf, min_t(size_t, bufsz, ns->msg_ctlmax));
885                 if (IS_ERR(copy))
886                         return PTR_ERR(copy);
887         }
888         mode = convert_mode(&msgtyp, msgflg);
889
890         rcu_read_lock();
891         msq = msq_obtain_object_check(ns, msqid);
892         if (IS_ERR(msq)) {
893                 rcu_read_unlock();
894                 free_copy(copy);
895                 return PTR_ERR(msq);
896         }
897
898         for (;;) {
899                 struct msg_receiver msr_d;
900
901                 msg = ERR_PTR(-EACCES);
902                 if (ipcperms(ns, &msq->q_perm, S_IRUGO))
903                         goto out_unlock1;
904
905                 ipc_lock_object(&msq->q_perm);
906
907                 /* raced with RMID? */
908                 if (!ipc_valid_object(&msq->q_perm)) {
909                         msg = ERR_PTR(-EIDRM);
910                         goto out_unlock0;
911                 }
912
913                 msg = find_msg(msq, &msgtyp, mode);
914                 if (!IS_ERR(msg)) {
915                         /*
916                          * Found a suitable message.
917                          * Unlink it from the queue.
918                          */
919                         if ((bufsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) {
920                                 msg = ERR_PTR(-E2BIG);
921                                 goto out_unlock0;
922                         }
923                         /*
924                          * If we are copying, then do not unlink message and do
925                          * not update queue parameters.
926                          */
927                         if (msgflg & MSG_COPY) {
928                                 msg = copy_msg(msg, copy);
929                                 goto out_unlock0;
930                         }
931
932                         list_del(&msg->m_list);
933                         msq->q_qnum--;
934                         msq->q_rtime = get_seconds();
935                         msq->q_lrpid = task_tgid_vnr(current);
936                         msq->q_cbytes -= msg->m_ts;
937                         atomic_sub(msg->m_ts, &ns->msg_bytes);
938                         atomic_dec(&ns->msg_hdrs);
939                         ss_wakeup(msq, &wake_q, false);
940
941                         goto out_unlock0;
942                 }
943
944                 /* No message waiting. Wait for a message */
945                 if (msgflg & IPC_NOWAIT) {
946                         msg = ERR_PTR(-ENOMSG);
947                         goto out_unlock0;
948                 }
949
950                 list_add_tail(&msr_d.r_list, &msq->q_receivers);
951                 msr_d.r_tsk = current;
952                 msr_d.r_msgtype = msgtyp;
953                 msr_d.r_mode = mode;
954                 if (msgflg & MSG_NOERROR)
955                         msr_d.r_maxsize = INT_MAX;
956                 else
957                         msr_d.r_maxsize = bufsz;
958                 msr_d.r_msg = ERR_PTR(-EAGAIN);
959                 __set_current_state(TASK_INTERRUPTIBLE);
960
961                 ipc_unlock_object(&msq->q_perm);
962                 rcu_read_unlock();
963                 schedule();
964
965                 /*
966                  * Lockless receive, part 1:
967                  * We don't hold a reference to the queue and getting a
968                  * reference would defeat the idea of a lockless operation,
969                  * thus the code relies on rcu to guarantee the existence of
970                  * msq:
971                  * Prior to destruction, expunge_all(-EIRDM) changes r_msg.
972                  * Thus if r_msg is -EAGAIN, then the queue not yet destroyed.
973                  */
974                 rcu_read_lock();
975
976                 /*
977                  * Lockless receive, part 2:
978                  * The work in pipelined_send() and expunge_all():
979                  * - Set pointer to message
980                  * - Queue the receiver task for later wakeup
981                  * - Wake up the process after the lock is dropped.
982                  *
983                  * Should the process wake up before this wakeup (due to a
984                  * signal) it will either see the message and continue ...
985                  */
986                 msg = READ_ONCE(msr_d.r_msg);
987                 if (msg != ERR_PTR(-EAGAIN))
988                         goto out_unlock1;
989
990                  /*
991                   * ... or see -EAGAIN, acquire the lock to check the message
992                   * again.
993                   */
994                 ipc_lock_object(&msq->q_perm);
995
996                 msg = msr_d.r_msg;
997                 if (msg != ERR_PTR(-EAGAIN))
998                         goto out_unlock0;
999
1000                 list_del(&msr_d.r_list);
1001                 if (signal_pending(current)) {
1002                         msg = ERR_PTR(-ERESTARTNOHAND);
1003                         goto out_unlock0;
1004                 }
1005
1006                 ipc_unlock_object(&msq->q_perm);
1007         }
1008
1009 out_unlock0:
1010         ipc_unlock_object(&msq->q_perm);
1011         wake_up_q(&wake_q);
1012 out_unlock1:
1013         rcu_read_unlock();
1014         if (IS_ERR(msg)) {
1015                 free_copy(copy);
1016                 return PTR_ERR(msg);
1017         }
1018
1019         bufsz = msg_handler(buf, msg, bufsz);
1020         free_msg(msg);
1021
1022         return bufsz;
1023 }
1024
1025 SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
1026                 long, msgtyp, int, msgflg)
1027 {
1028         return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill);
1029 }
1030
1031
1032 void msg_init_ns(struct ipc_namespace *ns)
1033 {
1034         ns->msg_ctlmax = MSGMAX;
1035         ns->msg_ctlmnb = MSGMNB;
1036         ns->msg_ctlmni = MSGMNI;
1037
1038         atomic_set(&ns->msg_bytes, 0);
1039         atomic_set(&ns->msg_hdrs, 0);
1040         ipc_init_ids(&ns->ids[IPC_MSG_IDS]);
1041 }
1042
1043 #ifdef CONFIG_IPC_NS
1044 void msg_exit_ns(struct ipc_namespace *ns)
1045 {
1046         free_ipcs(ns, &msg_ids(ns), freeque);
1047         idr_destroy(&ns->ids[IPC_MSG_IDS].ipcs_idr);
1048 }
1049 #endif
1050
1051 #ifdef CONFIG_PROC_FS
1052 static int sysvipc_msg_proc_show(struct seq_file *s, void *it)
1053 {
1054         struct user_namespace *user_ns = seq_user_ns(s);
1055         struct msg_queue *msq = it;
1056
1057         seq_printf(s,
1058                    "%10d %10d  %4o  %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n",
1059                    msq->q_perm.key,
1060                    msq->q_perm.id,
1061                    msq->q_perm.mode,
1062                    msq->q_cbytes,
1063                    msq->q_qnum,
1064                    msq->q_lspid,
1065                    msq->q_lrpid,
1066                    from_kuid_munged(user_ns, msq->q_perm.uid),
1067                    from_kgid_munged(user_ns, msq->q_perm.gid),
1068                    from_kuid_munged(user_ns, msq->q_perm.cuid),
1069                    from_kgid_munged(user_ns, msq->q_perm.cgid),
1070                    msq->q_stime,
1071                    msq->q_rtime,
1072                    msq->q_ctime);
1073
1074         return 0;
1075 }
1076 #endif
1077
1078 void __init msg_init(void)
1079 {
1080         msg_init_ns(&init_ipc_ns);
1081
1082         ipc_init_proc_interface("sysvipc/msg",
1083                                 "       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime\n",
1084                                 IPC_MSG_IDS, sysvipc_msg_proc_show);
1085 }