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