msg.c 28 KB

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