~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/ipc/shm.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * linux/ipc/shm.c
  4  * Copyright (C) 1992, 1993 Krishna Balasubramanian
  5  *       Many improvements/fixes by Bruno Haible.
  6  * Replaced `struct shm_desc' by `struct vm_area_struct', July 1994.
  7  * Fixed the shm swap deallocation (shm_unuse()), August 1998 Andrea Arcangeli.
  8  *
  9  * /proc/sysvipc/shm support (c) 1999 Dragos Acostachioaie <dragos@iname.com>
 10  * BIGMEM support, Andrea Arcangeli <andrea@suse.de>
 11  * SMP thread shm, Jean-Luc Boyard <jean-luc.boyard@siemens.fr>
 12  * HIGHMEM support, Ingo Molnar <mingo@redhat.com>
 13  * Make shmmax, shmall, shmmni sysctl'able, Christoph Rohland <cr@sap.com>
 14  * Shared /dev/zero support, Kanoj Sarcar <kanoj@sgi.com>
 15  * Move the mm functionality over to mm/shmem.c, Christoph Rohland <cr@sap.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  * Better ipc lock (kern_ipc_perm.lock) handling
 25  * Davidlohr Bueso <davidlohr.bueso@hp.com>, June 2013.
 26  */
 27 
 28 #include <linux/slab.h>
 29 #include <linux/mm.h>
 30 #include <linux/hugetlb.h>
 31 #include <linux/shm.h>
 32 #include <uapi/linux/shm.h>
 33 #include <linux/init.h>
 34 #include <linux/file.h>
 35 #include <linux/mman.h>
 36 #include <linux/shmem_fs.h>
 37 #include <linux/security.h>
 38 #include <linux/syscalls.h>
 39 #include <linux/audit.h>
 40 #include <linux/capability.h>
 41 #include <linux/ptrace.h>
 42 #include <linux/seq_file.h>
 43 #include <linux/rwsem.h>
 44 #include <linux/nsproxy.h>
 45 #include <linux/mount.h>
 46 #include <linux/ipc_namespace.h>
 47 #include <linux/rhashtable.h>
 48 
 49 #include <linux/uaccess.h>
 50 
 51 #include "util.h"
 52 
 53 struct shmid_kernel /* private to the kernel */
 54 {
 55         struct kern_ipc_perm    shm_perm;
 56         struct file             *shm_file;
 57         unsigned long           shm_nattch;
 58         unsigned long           shm_segsz;
 59         time64_t                shm_atim;
 60         time64_t                shm_dtim;
 61         time64_t                shm_ctim;
 62         struct pid              *shm_cprid;
 63         struct pid              *shm_lprid;
 64         struct ucounts          *mlock_ucounts;
 65 
 66         /*
 67          * The task created the shm object, for
 68          * task_lock(shp->shm_creator)
 69          */
 70         struct task_struct      *shm_creator;
 71 
 72         /*
 73          * List by creator. task_lock(->shm_creator) required for read/write.
 74          * If list_empty(), then the creator is dead already.
 75          */
 76         struct list_head        shm_clist;
 77         struct ipc_namespace    *ns;
 78 } __randomize_layout;
 79 
 80 /* shm_mode upper byte flags */
 81 #define SHM_DEST        01000   /* segment will be destroyed on last detach */
 82 #define SHM_LOCKED      02000   /* segment will not be swapped */
 83 
 84 struct shm_file_data {
 85         int id;
 86         struct ipc_namespace *ns;
 87         struct file *file;
 88         const struct vm_operations_struct *vm_ops;
 89 };
 90 
 91 #define shm_file_data(file) (*((struct shm_file_data **)&(file)->private_data))
 92 
 93 static const struct file_operations shm_file_operations;
 94 static const struct vm_operations_struct shm_vm_ops;
 95 
 96 #define shm_ids(ns)     ((ns)->ids[IPC_SHM_IDS])
 97 
 98 #define shm_unlock(shp)                 \
 99         ipc_unlock(&(shp)->shm_perm)
100 
101 static int newseg(struct ipc_namespace *, struct ipc_params *);
102 static void shm_open(struct vm_area_struct *vma);
103 static void shm_close(struct vm_area_struct *vma);
104 static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp);
105 #ifdef CONFIG_PROC_FS
106 static int sysvipc_shm_proc_show(struct seq_file *s, void *it);
107 #endif
108 
109 void shm_init_ns(struct ipc_namespace *ns)
110 {
111         ns->shm_ctlmax = SHMMAX;
112         ns->shm_ctlall = SHMALL;
113         ns->shm_ctlmni = SHMMNI;
114         ns->shm_rmid_forced = 0;
115         ns->shm_tot = 0;
116         ipc_init_ids(&shm_ids(ns));
117 }
118 
119 /*
120  * Called with shm_ids.rwsem (writer) and the shp structure locked.
121  * Only shm_ids.rwsem remains locked on exit.
122  */
123 static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
124 {
125         struct shmid_kernel *shp;
126 
127         shp = container_of(ipcp, struct shmid_kernel, shm_perm);
128         WARN_ON(ns != shp->ns);
129 
130         if (shp->shm_nattch) {
131                 shp->shm_perm.mode |= SHM_DEST;
132                 /* Do not find it any more */
133                 ipc_set_key_private(&shm_ids(ns), &shp->shm_perm);
134                 shm_unlock(shp);
135         } else
136                 shm_destroy(ns, shp);
137 }
138 
139 #ifdef CONFIG_IPC_NS
140 void shm_exit_ns(struct ipc_namespace *ns)
141 {
142         free_ipcs(ns, &shm_ids(ns), do_shm_rmid);
143         idr_destroy(&ns->ids[IPC_SHM_IDS].ipcs_idr);
144         rhashtable_destroy(&ns->ids[IPC_SHM_IDS].key_ht);
145 }
146 #endif
147 
148 static int __init ipc_ns_init(void)
149 {
150         shm_init_ns(&init_ipc_ns);
151         return 0;
152 }
153 
154 pure_initcall(ipc_ns_init);
155 
156 void __init shm_init(void)
157 {
158         ipc_init_proc_interface("sysvipc/shm",
159 #if BITS_PER_LONG <= 32
160                                 "       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime        rss       swap\n",
161 #else
162                                 "       key      shmid perms                  size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime                   rss                  swap\n",
163 #endif
164                                 IPC_SHM_IDS, sysvipc_shm_proc_show);
165 }
166 
167 static inline struct shmid_kernel *shm_obtain_object(struct ipc_namespace *ns, int id)
168 {
169         struct kern_ipc_perm *ipcp = ipc_obtain_object_idr(&shm_ids(ns), id);
170 
171         if (IS_ERR(ipcp))
172                 return ERR_CAST(ipcp);
173 
174         return container_of(ipcp, struct shmid_kernel, shm_perm);
175 }
176 
177 static inline struct shmid_kernel *shm_obtain_object_check(struct ipc_namespace *ns, int id)
178 {
179         struct kern_ipc_perm *ipcp = ipc_obtain_object_check(&shm_ids(ns), id);
180 
181         if (IS_ERR(ipcp))
182                 return ERR_CAST(ipcp);
183 
184         return container_of(ipcp, struct shmid_kernel, shm_perm);
185 }
186 
187 /*
188  * shm_lock_(check_) routines are called in the paths where the rwsem
189  * is not necessarily held.
190  */
191 static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id)
192 {
193         struct kern_ipc_perm *ipcp;
194 
195         rcu_read_lock();
196         ipcp = ipc_obtain_object_idr(&shm_ids(ns), id);
197         if (IS_ERR(ipcp))
198                 goto err;
199 
200         ipc_lock_object(ipcp);
201         /*
202          * ipc_rmid() may have already freed the ID while ipc_lock_object()
203          * was spinning: here verify that the structure is still valid.
204          * Upon races with RMID, return -EIDRM, thus indicating that
205          * the ID points to a removed identifier.
206          */
207         if (ipc_valid_object(ipcp)) {
208                 /* return a locked ipc object upon success */
209                 return container_of(ipcp, struct shmid_kernel, shm_perm);
210         }
211 
212         ipc_unlock_object(ipcp);
213         ipcp = ERR_PTR(-EIDRM);
214 err:
215         rcu_read_unlock();
216         /*
217          * Callers of shm_lock() must validate the status of the returned ipc
218          * object pointer and error out as appropriate.
219          */
220         return ERR_CAST(ipcp);
221 }
222 
223 static inline void shm_lock_by_ptr(struct shmid_kernel *ipcp)
224 {
225         rcu_read_lock();
226         ipc_lock_object(&ipcp->shm_perm);
227 }
228 
229 static void shm_rcu_free(struct rcu_head *head)
230 {
231         struct kern_ipc_perm *ptr = container_of(head, struct kern_ipc_perm,
232                                                         rcu);
233         struct shmid_kernel *shp = container_of(ptr, struct shmid_kernel,
234                                                         shm_perm);
235         security_shm_free(&shp->shm_perm);
236         kfree(shp);
237 }
238 
239 /*
240  * It has to be called with shp locked.
241  * It must be called before ipc_rmid()
242  */
243 static inline void shm_clist_rm(struct shmid_kernel *shp)
244 {
245         struct task_struct *creator;
246 
247         /* ensure that shm_creator does not disappear */
248         rcu_read_lock();
249 
250         /*
251          * A concurrent exit_shm may do a list_del_init() as well.
252          * Just do nothing if exit_shm already did the work
253          */
254         if (!list_empty(&shp->shm_clist)) {
255                 /*
256                  * shp->shm_creator is guaranteed to be valid *only*
257                  * if shp->shm_clist is not empty.
258                  */
259                 creator = shp->shm_creator;
260 
261                 task_lock(creator);
262                 /*
263                  * list_del_init() is a nop if the entry was already removed
264                  * from the list.
265                  */
266                 list_del_init(&shp->shm_clist);
267                 task_unlock(creator);
268         }
269         rcu_read_unlock();
270 }
271 
272 static inline void shm_rmid(struct shmid_kernel *s)
273 {
274         shm_clist_rm(s);
275         ipc_rmid(&shm_ids(s->ns), &s->shm_perm);
276 }
277 
278 
279 static int __shm_open(struct shm_file_data *sfd)
280 {
281         struct shmid_kernel *shp;
282 
283         shp = shm_lock(sfd->ns, sfd->id);
284 
285         if (IS_ERR(shp))
286                 return PTR_ERR(shp);
287 
288         if (shp->shm_file != sfd->file) {
289                 /* ID was reused */
290                 shm_unlock(shp);
291                 return -EINVAL;
292         }
293 
294         shp->shm_atim = ktime_get_real_seconds();
295         ipc_update_pid(&shp->shm_lprid, task_tgid(current));
296         shp->shm_nattch++;
297         shm_unlock(shp);
298         return 0;
299 }
300 
301 /* This is called by fork, once for every shm attach. */
302 static void shm_open(struct vm_area_struct *vma)
303 {
304         struct file *file = vma->vm_file;
305         struct shm_file_data *sfd = shm_file_data(file);
306         int err;
307 
308         /* Always call underlying open if present */
309         if (sfd->vm_ops->open)
310                 sfd->vm_ops->open(vma);
311 
312         err = __shm_open(sfd);
313         /*
314          * We raced in the idr lookup or with shm_destroy().
315          * Either way, the ID is busted.
316          */
317         WARN_ON_ONCE(err);
318 }
319 
320 /*
321  * shm_destroy - free the struct shmid_kernel
322  *
323  * @ns: namespace
324  * @shp: struct to free
325  *
326  * It has to be called with shp and shm_ids.rwsem (writer) locked,
327  * but returns with shp unlocked and freed.
328  */
329 static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
330 {
331         struct file *shm_file;
332 
333         shm_file = shp->shm_file;
334         shp->shm_file = NULL;
335         ns->shm_tot -= (shp->shm_segsz + PAGE_SIZE - 1) >> PAGE_SHIFT;
336         shm_rmid(shp);
337         shm_unlock(shp);
338         if (!is_file_hugepages(shm_file))
339                 shmem_lock(shm_file, 0, shp->mlock_ucounts);
340         fput(shm_file);
341         ipc_update_pid(&shp->shm_cprid, NULL);
342         ipc_update_pid(&shp->shm_lprid, NULL);
343         ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
344 }
345 
346 /*
347  * shm_may_destroy - identifies whether shm segment should be destroyed now
348  *
349  * Returns true if and only if there are no active users of the segment and
350  * one of the following is true:
351  *
352  * 1) shmctl(id, IPC_RMID, NULL) was called for this shp
353  *
354  * 2) sysctl kernel.shm_rmid_forced is set to 1.
355  */
356 static bool shm_may_destroy(struct shmid_kernel *shp)
357 {
358         return (shp->shm_nattch == 0) &&
359                (shp->ns->shm_rmid_forced ||
360                 (shp->shm_perm.mode & SHM_DEST));
361 }
362 
363 /*
364  * remove the attach descriptor vma.
365  * free memory for segment if it is marked destroyed.
366  * The descriptor has already been removed from the current->mm->mmap list
367  * and will later be kfree()d.
368  */
369 static void __shm_close(struct shm_file_data *sfd)
370 {
371         struct shmid_kernel *shp;
372         struct ipc_namespace *ns = sfd->ns;
373 
374         down_write(&shm_ids(ns).rwsem);
375         /* remove from the list of attaches of the shm segment */
376         shp = shm_lock(ns, sfd->id);
377 
378         /*
379          * We raced in the idr lookup or with shm_destroy().
380          * Either way, the ID is busted.
381          */
382         if (WARN_ON_ONCE(IS_ERR(shp)))
383                 goto done; /* no-op */
384 
385         ipc_update_pid(&shp->shm_lprid, task_tgid(current));
386         shp->shm_dtim = ktime_get_real_seconds();
387         shp->shm_nattch--;
388         if (shm_may_destroy(shp))
389                 shm_destroy(ns, shp);
390         else
391                 shm_unlock(shp);
392 done:
393         up_write(&shm_ids(ns).rwsem);
394 }
395 
396 static void shm_close(struct vm_area_struct *vma)
397 {
398         struct file *file = vma->vm_file;
399         struct shm_file_data *sfd = shm_file_data(file);
400 
401         /* Always call underlying close if present */
402         if (sfd->vm_ops->close)
403                 sfd->vm_ops->close(vma);
404 
405         __shm_close(sfd);
406 }
407 
408 /* Called with ns->shm_ids(ns).rwsem locked */
409 static int shm_try_destroy_orphaned(int id, void *p, void *data)
410 {
411         struct ipc_namespace *ns = data;
412         struct kern_ipc_perm *ipcp = p;
413         struct shmid_kernel *shp = container_of(ipcp, struct shmid_kernel, shm_perm);
414 
415         /*
416          * We want to destroy segments without users and with already
417          * exit'ed originating process.
418          *
419          * As shp->* are changed under rwsem, it's safe to skip shp locking.
420          */
421         if (!list_empty(&shp->shm_clist))
422                 return 0;
423 
424         if (shm_may_destroy(shp)) {
425                 shm_lock_by_ptr(shp);
426                 shm_destroy(ns, shp);
427         }
428         return 0;
429 }
430 
431 void shm_destroy_orphaned(struct ipc_namespace *ns)
432 {
433         down_write(&shm_ids(ns).rwsem);
434         if (shm_ids(ns).in_use)
435                 idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns);
436         up_write(&shm_ids(ns).rwsem);
437 }
438 
439 /* Locking assumes this will only be called with task == current */
440 void exit_shm(struct task_struct *task)
441 {
442         for (;;) {
443                 struct shmid_kernel *shp;
444                 struct ipc_namespace *ns;
445 
446                 task_lock(task);
447 
448                 if (list_empty(&task->sysvshm.shm_clist)) {
449                         task_unlock(task);
450                         break;
451                 }
452 
453                 shp = list_first_entry(&task->sysvshm.shm_clist, struct shmid_kernel,
454                                 shm_clist);
455 
456                 /*
457                  * 1) Get pointer to the ipc namespace. It is worth to say
458                  * that this pointer is guaranteed to be valid because
459                  * shp lifetime is always shorter than namespace lifetime
460                  * in which shp lives.
461                  * We taken task_lock it means that shp won't be freed.
462                  */
463                 ns = shp->ns;
464 
465                 /*
466                  * 2) If kernel.shm_rmid_forced is not set then only keep track of
467                  * which shmids are orphaned, so that a later set of the sysctl
468                  * can clean them up.
469                  */
470                 if (!ns->shm_rmid_forced)
471                         goto unlink_continue;
472 
473                 /*
474                  * 3) get a reference to the namespace.
475                  *    The refcount could be already 0. If it is 0, then
476                  *    the shm objects will be free by free_ipc_work().
477                  */
478                 ns = get_ipc_ns_not_zero(ns);
479                 if (!ns) {
480 unlink_continue:
481                         list_del_init(&shp->shm_clist);
482                         task_unlock(task);
483                         continue;
484                 }
485 
486                 /*
487                  * 4) get a reference to shp.
488                  *   This cannot fail: shm_clist_rm() is called before
489                  *   ipc_rmid(), thus the refcount cannot be 0.
490                  */
491                 WARN_ON(!ipc_rcu_getref(&shp->shm_perm));
492 
493                 /*
494                  * 5) unlink the shm segment from the list of segments
495                  *    created by current.
496                  *    This must be done last. After unlinking,
497                  *    only the refcounts obtained above prevent IPC_RMID
498                  *    from destroying the segment or the namespace.
499                  */
500                 list_del_init(&shp->shm_clist);
501 
502                 task_unlock(task);
503 
504                 /*
505                  * 6) we have all references
506                  *    Thus lock & if needed destroy shp.
507                  */
508                 down_write(&shm_ids(ns).rwsem);
509                 shm_lock_by_ptr(shp);
510                 /*
511                  * rcu_read_lock was implicitly taken in shm_lock_by_ptr, it's
512                  * safe to call ipc_rcu_putref here
513                  */
514                 ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
515 
516                 if (ipc_valid_object(&shp->shm_perm)) {
517                         if (shm_may_destroy(shp))
518                                 shm_destroy(ns, shp);
519                         else
520                                 shm_unlock(shp);
521                 } else {
522                         /*
523                          * Someone else deleted the shp from namespace
524                          * idr/kht while we have waited.
525                          * Just unlock and continue.
526                          */
527                         shm_unlock(shp);
528                 }
529 
530                 up_write(&shm_ids(ns).rwsem);
531                 put_ipc_ns(ns); /* paired with get_ipc_ns_not_zero */
532         }
533 }
534 
535 static vm_fault_t shm_fault(struct vm_fault *vmf)
536 {
537         struct file *file = vmf->vma->vm_file;
538         struct shm_file_data *sfd = shm_file_data(file);
539 
540         return sfd->vm_ops->fault(vmf);
541 }
542 
543 static int shm_may_split(struct vm_area_struct *vma, unsigned long addr)
544 {
545         struct file *file = vma->vm_file;
546         struct shm_file_data *sfd = shm_file_data(file);
547 
548         if (sfd->vm_ops->may_split)
549                 return sfd->vm_ops->may_split(vma, addr);
550 
551         return 0;
552 }
553 
554 static unsigned long shm_pagesize(struct vm_area_struct *vma)
555 {
556         struct file *file = vma->vm_file;
557         struct shm_file_data *sfd = shm_file_data(file);
558 
559         if (sfd->vm_ops->pagesize)
560                 return sfd->vm_ops->pagesize(vma);
561 
562         return PAGE_SIZE;
563 }
564 
565 #ifdef CONFIG_NUMA
566 static int shm_set_policy(struct vm_area_struct *vma, struct mempolicy *mpol)
567 {
568         struct shm_file_data *sfd = shm_file_data(vma->vm_file);
569         int err = 0;
570 
571         if (sfd->vm_ops->set_policy)
572                 err = sfd->vm_ops->set_policy(vma, mpol);
573         return err;
574 }
575 
576 static struct mempolicy *shm_get_policy(struct vm_area_struct *vma,
577                                         unsigned long addr, pgoff_t *ilx)
578 {
579         struct shm_file_data *sfd = shm_file_data(vma->vm_file);
580         struct mempolicy *mpol = vma->vm_policy;
581 
582         if (sfd->vm_ops->get_policy)
583                 mpol = sfd->vm_ops->get_policy(vma, addr, ilx);
584         return mpol;
585 }
586 #endif
587 
588 static int shm_mmap(struct file *file, struct vm_area_struct *vma)
589 {
590         struct shm_file_data *sfd = shm_file_data(file);
591         int ret;
592 
593         /*
594          * In case of remap_file_pages() emulation, the file can represent an
595          * IPC ID that was removed, and possibly even reused by another shm
596          * segment already.  Propagate this case as an error to caller.
597          */
598         ret = __shm_open(sfd);
599         if (ret)
600                 return ret;
601 
602         ret = call_mmap(sfd->file, vma);
603         if (ret) {
604                 __shm_close(sfd);
605                 return ret;
606         }
607         sfd->vm_ops = vma->vm_ops;
608 #ifdef CONFIG_MMU
609         WARN_ON(!sfd->vm_ops->fault);
610 #endif
611         vma->vm_ops = &shm_vm_ops;
612         return 0;
613 }
614 
615 static int shm_release(struct inode *ino, struct file *file)
616 {
617         struct shm_file_data *sfd = shm_file_data(file);
618 
619         put_ipc_ns(sfd->ns);
620         fput(sfd->file);
621         shm_file_data(file) = NULL;
622         kfree(sfd);
623         return 0;
624 }
625 
626 static int shm_fsync(struct file *file, loff_t start, loff_t end, int datasync)
627 {
628         struct shm_file_data *sfd = shm_file_data(file);
629 
630         if (!sfd->file->f_op->fsync)
631                 return -EINVAL;
632         return sfd->file->f_op->fsync(sfd->file, start, end, datasync);
633 }
634 
635 static long shm_fallocate(struct file *file, int mode, loff_t offset,
636                           loff_t len)
637 {
638         struct shm_file_data *sfd = shm_file_data(file);
639 
640         if (!sfd->file->f_op->fallocate)
641                 return -EOPNOTSUPP;
642         return sfd->file->f_op->fallocate(file, mode, offset, len);
643 }
644 
645 static unsigned long shm_get_unmapped_area(struct file *file,
646         unsigned long addr, unsigned long len, unsigned long pgoff,
647         unsigned long flags)
648 {
649         struct shm_file_data *sfd = shm_file_data(file);
650 
651         return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len,
652                                                 pgoff, flags);
653 }
654 
655 static const struct file_operations shm_file_operations = {
656         .mmap           = shm_mmap,
657         .fsync          = shm_fsync,
658         .release        = shm_release,
659         .get_unmapped_area      = shm_get_unmapped_area,
660         .llseek         = noop_llseek,
661         .fallocate      = shm_fallocate,
662 };
663 
664 /*
665  * shm_file_operations_huge is now identical to shm_file_operations
666  * except for fop_flags
667  */
668 static const struct file_operations shm_file_operations_huge = {
669         .mmap           = shm_mmap,
670         .fsync          = shm_fsync,
671         .release        = shm_release,
672         .get_unmapped_area      = shm_get_unmapped_area,
673         .llseek         = noop_llseek,
674         .fallocate      = shm_fallocate,
675         .fop_flags      = FOP_HUGE_PAGES,
676 };
677 
678 static const struct vm_operations_struct shm_vm_ops = {
679         .open   = shm_open,     /* callback for a new vm-area open */
680         .close  = shm_close,    /* callback for when the vm-area is released */
681         .fault  = shm_fault,
682         .may_split = shm_may_split,
683         .pagesize = shm_pagesize,
684 #if defined(CONFIG_NUMA)
685         .set_policy = shm_set_policy,
686         .get_policy = shm_get_policy,
687 #endif
688 };
689 
690 /**
691  * newseg - Create a new shared memory segment
692  * @ns: namespace
693  * @params: ptr to the structure that contains key, size and shmflg
694  *
695  * Called with shm_ids.rwsem held as a writer.
696  */
697 static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
698 {
699         key_t key = params->key;
700         int shmflg = params->flg;
701         size_t size = params->u.size;
702         int error;
703         struct shmid_kernel *shp;
704         size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
705         struct file *file;
706         char name[13];
707         vm_flags_t acctflag = 0;
708 
709         if (size < SHMMIN || size > ns->shm_ctlmax)
710                 return -EINVAL;
711 
712         if (numpages << PAGE_SHIFT < size)
713                 return -ENOSPC;
714 
715         if (ns->shm_tot + numpages < ns->shm_tot ||
716                         ns->shm_tot + numpages > ns->shm_ctlall)
717                 return -ENOSPC;
718 
719         shp = kmalloc(sizeof(*shp), GFP_KERNEL_ACCOUNT);
720         if (unlikely(!shp))
721                 return -ENOMEM;
722 
723         shp->shm_perm.key = key;
724         shp->shm_perm.mode = (shmflg & S_IRWXUGO);
725         shp->mlock_ucounts = NULL;
726 
727         shp->shm_perm.security = NULL;
728         error = security_shm_alloc(&shp->shm_perm);
729         if (error) {
730                 kfree(shp);
731                 return error;
732         }
733 
734         sprintf(name, "SYSV%08x", key);
735         if (shmflg & SHM_HUGETLB) {
736                 struct hstate *hs;
737                 size_t hugesize;
738 
739                 hs = hstate_sizelog((shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK);
740                 if (!hs) {
741                         error = -EINVAL;
742                         goto no_file;
743                 }
744                 hugesize = ALIGN(size, huge_page_size(hs));
745 
746                 /* hugetlb_file_setup applies strict accounting */
747                 if (shmflg & SHM_NORESERVE)
748                         acctflag = VM_NORESERVE;
749                 file = hugetlb_file_setup(name, hugesize, acctflag,
750                                 HUGETLB_SHMFS_INODE, (shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK);
751         } else {
752                 /*
753                  * Do not allow no accounting for OVERCOMMIT_NEVER, even
754                  * if it's asked for.
755                  */
756                 if  ((shmflg & SHM_NORESERVE) &&
757                                 sysctl_overcommit_memory != OVERCOMMIT_NEVER)
758                         acctflag = VM_NORESERVE;
759                 file = shmem_kernel_file_setup(name, size, acctflag);
760         }
761         error = PTR_ERR(file);
762         if (IS_ERR(file))
763                 goto no_file;
764 
765         shp->shm_cprid = get_pid(task_tgid(current));
766         shp->shm_lprid = NULL;
767         shp->shm_atim = shp->shm_dtim = 0;
768         shp->shm_ctim = ktime_get_real_seconds();
769         shp->shm_segsz = size;
770         shp->shm_nattch = 0;
771         shp->shm_file = file;
772         shp->shm_creator = current;
773 
774         /* ipc_addid() locks shp upon success. */
775         error = ipc_addid(&shm_ids(ns), &shp->shm_perm, ns->shm_ctlmni);
776         if (error < 0)
777                 goto no_id;
778 
779         shp->ns = ns;
780 
781         task_lock(current);
782         list_add(&shp->shm_clist, &current->sysvshm.shm_clist);
783         task_unlock(current);
784 
785         /*
786          * shmid gets reported as "inode#" in /proc/pid/maps.
787          * proc-ps tools use this. Changing this will break them.
788          */
789         file_inode(file)->i_ino = shp->shm_perm.id;
790 
791         ns->shm_tot += numpages;
792         error = shp->shm_perm.id;
793 
794         ipc_unlock_object(&shp->shm_perm);
795         rcu_read_unlock();
796         return error;
797 
798 no_id:
799         ipc_update_pid(&shp->shm_cprid, NULL);
800         ipc_update_pid(&shp->shm_lprid, NULL);
801         fput(file);
802         ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
803         return error;
804 no_file:
805         call_rcu(&shp->shm_perm.rcu, shm_rcu_free);
806         return error;
807 }
808 
809 /*
810  * Called with shm_ids.rwsem and ipcp locked.
811  */
812 static int shm_more_checks(struct kern_ipc_perm *ipcp, struct ipc_params *params)
813 {
814         struct shmid_kernel *shp;
815 
816         shp = container_of(ipcp, struct shmid_kernel, shm_perm);
817         if (shp->shm_segsz < params->u.size)
818                 return -EINVAL;
819 
820         return 0;
821 }
822 
823 long ksys_shmget(key_t key, size_t size, int shmflg)
824 {
825         struct ipc_namespace *ns;
826         static const struct ipc_ops shm_ops = {
827                 .getnew = newseg,
828                 .associate = security_shm_associate,
829                 .more_checks = shm_more_checks,
830         };
831         struct ipc_params shm_params;
832 
833         ns = current->nsproxy->ipc_ns;
834 
835         shm_params.key = key;
836         shm_params.flg = shmflg;
837         shm_params.u.size = size;
838 
839         return ipcget(ns, &shm_ids(ns), &shm_ops, &shm_params);
840 }
841 
842 SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
843 {
844         return ksys_shmget(key, size, shmflg);
845 }
846 
847 static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_ds *in, int version)
848 {
849         switch (version) {
850         case IPC_64:
851                 return copy_to_user(buf, in, sizeof(*in));
852         case IPC_OLD:
853             {
854                 struct shmid_ds out;
855 
856                 memset(&out, 0, sizeof(out));
857                 ipc64_perm_to_ipc_perm(&in->shm_perm, &out.shm_perm);
858                 out.shm_segsz   = in->shm_segsz;
859                 out.shm_atime   = in->shm_atime;
860                 out.shm_dtime   = in->shm_dtime;
861                 out.shm_ctime   = in->shm_ctime;
862                 out.shm_cpid    = in->shm_cpid;
863                 out.shm_lpid    = in->shm_lpid;
864                 out.shm_nattch  = in->shm_nattch;
865 
866                 return copy_to_user(buf, &out, sizeof(out));
867             }
868         default:
869                 return -EINVAL;
870         }
871 }
872 
873 static inline unsigned long
874 copy_shmid_from_user(struct shmid64_ds *out, void __user *buf, int version)
875 {
876         switch (version) {
877         case IPC_64:
878                 if (copy_from_user(out, buf, sizeof(*out)))
879                         return -EFAULT;
880                 return 0;
881         case IPC_OLD:
882             {
883                 struct shmid_ds tbuf_old;
884 
885                 if (copy_from_user(&tbuf_old, buf, sizeof(tbuf_old)))
886                         return -EFAULT;
887 
888                 out->shm_perm.uid       = tbuf_old.shm_perm.uid;
889                 out->shm_perm.gid       = tbuf_old.shm_perm.gid;
890                 out->shm_perm.mode      = tbuf_old.shm_perm.mode;
891 
892                 return 0;
893             }
894         default:
895                 return -EINVAL;
896         }
897 }
898 
899 static inline unsigned long copy_shminfo_to_user(void __user *buf, struct shminfo64 *in, int version)
900 {
901         switch (version) {
902         case IPC_64:
903                 return copy_to_user(buf, in, sizeof(*in));
904         case IPC_OLD:
905             {
906                 struct shminfo out;
907 
908                 if (in->shmmax > INT_MAX)
909                         out.shmmax = INT_MAX;
910                 else
911                         out.shmmax = (int)in->shmmax;
912 
913                 out.shmmin      = in->shmmin;
914                 out.shmmni      = in->shmmni;
915                 out.shmseg      = in->shmseg;
916                 out.shmall      = in->shmall;
917 
918                 return copy_to_user(buf, &out, sizeof(out));
919             }
920         default:
921                 return -EINVAL;
922         }
923 }
924 
925 /*
926  * Calculate and add used RSS and swap pages of a shm.
927  * Called with shm_ids.rwsem held as a reader
928  */
929 static void shm_add_rss_swap(struct shmid_kernel *shp,
930         unsigned long *rss_add, unsigned long *swp_add)
931 {
932         struct inode *inode;
933 
934         inode = file_inode(shp->shm_file);
935 
936         if (is_file_hugepages(shp->shm_file)) {
937                 struct address_space *mapping = inode->i_mapping;
938                 struct hstate *h = hstate_file(shp->shm_file);
939                 *rss_add += pages_per_huge_page(h) * mapping->nrpages;
940         } else {
941 #ifdef CONFIG_SHMEM
942                 struct shmem_inode_info *info = SHMEM_I(inode);
943 
944                 spin_lock_irq(&info->lock);
945                 *rss_add += inode->i_mapping->nrpages;
946                 *swp_add += info->swapped;
947                 spin_unlock_irq(&info->lock);
948 #else
949                 *rss_add += inode->i_mapping->nrpages;
950 #endif
951         }
952 }
953 
954 /*
955  * Called with shm_ids.rwsem held as a reader
956  */
957 static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
958                 unsigned long *swp)
959 {
960         int next_id;
961         int total, in_use;
962 
963         *rss = 0;
964         *swp = 0;
965 
966         in_use = shm_ids(ns).in_use;
967 
968         for (total = 0, next_id = 0; total < in_use; next_id++) {
969                 struct kern_ipc_perm *ipc;
970                 struct shmid_kernel *shp;
971 
972                 ipc = idr_find(&shm_ids(ns).ipcs_idr, next_id);
973                 if (ipc == NULL)
974                         continue;
975                 shp = container_of(ipc, struct shmid_kernel, shm_perm);
976 
977                 shm_add_rss_swap(shp, rss, swp);
978 
979                 total++;
980         }
981 }
982 
983 /*
984  * This function handles some shmctl commands which require the rwsem
985  * to be held in write mode.
986  * NOTE: no locks must be held, the rwsem is taken inside this function.
987  */
988 static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd,
989                        struct shmid64_ds *shmid64)
990 {
991         struct kern_ipc_perm *ipcp;
992         struct shmid_kernel *shp;
993         int err;
994 
995         down_write(&shm_ids(ns).rwsem);
996         rcu_read_lock();
997 
998         ipcp = ipcctl_obtain_check(ns, &shm_ids(ns), shmid, cmd,
999                                       &shmid64->shm_perm, 0);
1000         if (IS_ERR(ipcp)) {
1001                 err = PTR_ERR(ipcp);
1002                 goto out_unlock1;
1003         }
1004 
1005         shp = container_of(ipcp, struct shmid_kernel, shm_perm);
1006 
1007         err = security_shm_shmctl(&shp->shm_perm, cmd);
1008         if (err)
1009                 goto out_unlock1;
1010 
1011         switch (cmd) {
1012         case IPC_RMID:
1013                 ipc_lock_object(&shp->shm_perm);
1014                 /* do_shm_rmid unlocks the ipc object and rcu */
1015                 do_shm_rmid(ns, ipcp);
1016                 goto out_up;
1017         case IPC_SET:
1018                 ipc_lock_object(&shp->shm_perm);
1019                 err = ipc_update_perm(&shmid64->shm_perm, ipcp);
1020                 if (err)
1021                         goto out_unlock0;
1022                 shp->shm_ctim = ktime_get_real_seconds();
1023                 break;
1024         default:
1025                 err = -EINVAL;
1026                 goto out_unlock1;
1027         }
1028 
1029 out_unlock0:
1030         ipc_unlock_object(&shp->shm_perm);
1031 out_unlock1:
1032         rcu_read_unlock();
1033 out_up:
1034         up_write(&shm_ids(ns).rwsem);
1035         return err;
1036 }
1037 
1038 static int shmctl_ipc_info(struct ipc_namespace *ns,
1039                            struct shminfo64 *shminfo)
1040 {
1041         int err = security_shm_shmctl(NULL, IPC_INFO);
1042         if (!err) {
1043                 memset(shminfo, 0, sizeof(*shminfo));
1044                 shminfo->shmmni = shminfo->shmseg = ns->shm_ctlmni;
1045                 shminfo->shmmax = ns->shm_ctlmax;
1046                 shminfo->shmall = ns->shm_ctlall;
1047                 shminfo->shmmin = SHMMIN;
1048                 down_read(&shm_ids(ns).rwsem);
1049                 err = ipc_get_maxidx(&shm_ids(ns));
1050                 up_read(&shm_ids(ns).rwsem);
1051                 if (err < 0)
1052                         err = 0;
1053         }
1054         return err;
1055 }
1056 
1057 static int shmctl_shm_info(struct ipc_namespace *ns,
1058                            struct shm_info *shm_info)
1059 {
1060         int err = security_shm_shmctl(NULL, SHM_INFO);
1061         if (!err) {
1062                 memset(shm_info, 0, sizeof(*shm_info));
1063                 down_read(&shm_ids(ns).rwsem);
1064                 shm_info->used_ids = shm_ids(ns).in_use;
1065                 shm_get_stat(ns, &shm_info->shm_rss, &shm_info->shm_swp);
1066                 shm_info->shm_tot = ns->shm_tot;
1067                 shm_info->swap_attempts = 0;
1068                 shm_info->swap_successes = 0;
1069                 err = ipc_get_maxidx(&shm_ids(ns));
1070                 up_read(&shm_ids(ns).rwsem);
1071                 if (err < 0)
1072                         err = 0;
1073         }
1074         return err;
1075 }
1076 
1077 static int shmctl_stat(struct ipc_namespace *ns, int shmid,
1078                         int cmd, struct shmid64_ds *tbuf)
1079 {
1080         struct shmid_kernel *shp;
1081         int err;
1082 
1083         memset(tbuf, 0, sizeof(*tbuf));
1084 
1085         rcu_read_lock();
1086         if (cmd == SHM_STAT || cmd == SHM_STAT_ANY) {
1087                 shp = shm_obtain_object(ns, shmid);
1088                 if (IS_ERR(shp)) {
1089                         err = PTR_ERR(shp);
1090                         goto out_unlock;
1091                 }
1092         } else { /* IPC_STAT */
1093                 shp = shm_obtain_object_check(ns, shmid);
1094                 if (IS_ERR(shp)) {
1095                         err = PTR_ERR(shp);
1096                         goto out_unlock;
1097                 }
1098         }
1099 
1100         /*
1101          * Semantically SHM_STAT_ANY ought to be identical to
1102          * that functionality provided by the /proc/sysvipc/
1103          * interface. As such, only audit these calls and
1104          * do not do traditional S_IRUGO permission checks on
1105          * the ipc object.
1106          */
1107         if (cmd == SHM_STAT_ANY)
1108                 audit_ipc_obj(&shp->shm_perm);
1109         else {
1110                 err = -EACCES;
1111                 if (ipcperms(ns, &shp->shm_perm, S_IRUGO))
1112                         goto out_unlock;
1113         }
1114 
1115         err = security_shm_shmctl(&shp->shm_perm, cmd);
1116         if (err)
1117                 goto out_unlock;
1118 
1119         ipc_lock_object(&shp->shm_perm);
1120 
1121         if (!ipc_valid_object(&shp->shm_perm)) {
1122                 ipc_unlock_object(&shp->shm_perm);
1123                 err = -EIDRM;
1124                 goto out_unlock;
1125         }
1126 
1127         kernel_to_ipc64_perm(&shp->shm_perm, &tbuf->shm_perm);
1128         tbuf->shm_segsz = shp->shm_segsz;
1129         tbuf->shm_atime = shp->shm_atim;
1130         tbuf->shm_dtime = shp->shm_dtim;
1131         tbuf->shm_ctime = shp->shm_ctim;
1132 #ifndef CONFIG_64BIT
1133         tbuf->shm_atime_high = shp->shm_atim >> 32;
1134         tbuf->shm_dtime_high = shp->shm_dtim >> 32;
1135         tbuf->shm_ctime_high = shp->shm_ctim >> 32;
1136 #endif
1137         tbuf->shm_cpid  = pid_vnr(shp->shm_cprid);
1138         tbuf->shm_lpid  = pid_vnr(shp->shm_lprid);
1139         tbuf->shm_nattch = shp->shm_nattch;
1140 
1141         if (cmd == IPC_STAT) {
1142                 /*
1143                  * As defined in SUS:
1144                  * Return 0 on success
1145                  */
1146                 err = 0;
1147         } else {
1148                 /*
1149                  * SHM_STAT and SHM_STAT_ANY (both Linux specific)
1150                  * Return the full id, including the sequence number
1151                  */
1152                 err = shp->shm_perm.id;
1153         }
1154 
1155         ipc_unlock_object(&shp->shm_perm);
1156 out_unlock:
1157         rcu_read_unlock();
1158         return err;
1159 }
1160 
1161 static int shmctl_do_lock(struct ipc_namespace *ns, int shmid, int cmd)
1162 {
1163         struct shmid_kernel *shp;
1164         struct file *shm_file;
1165         int err;
1166 
1167         rcu_read_lock();
1168         shp = shm_obtain_object_check(ns, shmid);
1169         if (IS_ERR(shp)) {
1170                 err = PTR_ERR(shp);
1171                 goto out_unlock1;
1172         }
1173 
1174         audit_ipc_obj(&(shp->shm_perm));
1175         err = security_shm_shmctl(&shp->shm_perm, cmd);
1176         if (err)
1177                 goto out_unlock1;
1178 
1179         ipc_lock_object(&shp->shm_perm);
1180 
1181         /* check if shm_destroy() is tearing down shp */
1182         if (!ipc_valid_object(&shp->shm_perm)) {
1183                 err = -EIDRM;
1184                 goto out_unlock0;
1185         }
1186 
1187         if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) {
1188                 kuid_t euid = current_euid();
1189 
1190                 if (!uid_eq(euid, shp->shm_perm.uid) &&
1191                     !uid_eq(euid, shp->shm_perm.cuid)) {
1192                         err = -EPERM;
1193                         goto out_unlock0;
1194                 }
1195                 if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) {
1196                         err = -EPERM;
1197                         goto out_unlock0;
1198                 }
1199         }
1200 
1201         shm_file = shp->shm_file;
1202         if (is_file_hugepages(shm_file))
1203                 goto out_unlock0;
1204 
1205         if (cmd == SHM_LOCK) {
1206                 struct ucounts *ucounts = current_ucounts();
1207 
1208                 err = shmem_lock(shm_file, 1, ucounts);
1209                 if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) {
1210                         shp->shm_perm.mode |= SHM_LOCKED;
1211                         shp->mlock_ucounts = ucounts;
1212                 }
1213                 goto out_unlock0;
1214         }
1215 
1216         /* SHM_UNLOCK */
1217         if (!(shp->shm_perm.mode & SHM_LOCKED))
1218                 goto out_unlock0;
1219         shmem_lock(shm_file, 0, shp->mlock_ucounts);
1220         shp->shm_perm.mode &= ~SHM_LOCKED;
1221         shp->mlock_ucounts = NULL;
1222         get_file(shm_file);
1223         ipc_unlock_object(&shp->shm_perm);
1224         rcu_read_unlock();
1225         shmem_unlock_mapping(shm_file->f_mapping);
1226 
1227         fput(shm_file);
1228         return err;
1229 
1230 out_unlock0:
1231         ipc_unlock_object(&shp->shm_perm);
1232 out_unlock1:
1233         rcu_read_unlock();
1234         return err;
1235 }
1236 
1237 static long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf, int version)
1238 {
1239         int err;
1240         struct ipc_namespace *ns;
1241         struct shmid64_ds sem64;
1242 
1243         if (cmd < 0 || shmid < 0)
1244                 return -EINVAL;
1245 
1246         ns = current->nsproxy->ipc_ns;
1247 
1248         switch (cmd) {
1249         case IPC_INFO: {
1250                 struct shminfo64 shminfo;
1251                 err = shmctl_ipc_info(ns, &shminfo);
1252                 if (err < 0)
1253                         return err;
1254                 if (copy_shminfo_to_user(buf, &shminfo, version))
1255                         err = -EFAULT;
1256                 return err;
1257         }
1258         case SHM_INFO: {
1259                 struct shm_info shm_info;
1260                 err = shmctl_shm_info(ns, &shm_info);
1261                 if (err < 0)
1262                         return err;
1263                 if (copy_to_user(buf, &shm_info, sizeof(shm_info)))
1264                         err = -EFAULT;
1265                 return err;
1266         }
1267         case SHM_STAT:
1268         case SHM_STAT_ANY:
1269         case IPC_STAT: {
1270                 err = shmctl_stat(ns, shmid, cmd, &sem64);
1271                 if (err < 0)
1272                         return err;
1273                 if (copy_shmid_to_user(buf, &sem64, version))
1274                         err = -EFAULT;
1275                 return err;
1276         }
1277         case IPC_SET:
1278                 if (copy_shmid_from_user(&sem64, buf, version))
1279                         return -EFAULT;
1280                 fallthrough;
1281         case IPC_RMID:
1282                 return shmctl_down(ns, shmid, cmd, &sem64);
1283         case SHM_LOCK:
1284         case SHM_UNLOCK:
1285                 return shmctl_do_lock(ns, shmid, cmd);
1286         default:
1287                 return -EINVAL;
1288         }
1289 }
1290 
1291 SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
1292 {
1293         return ksys_shmctl(shmid, cmd, buf, IPC_64);
1294 }
1295 
1296 #ifdef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
1297 long ksys_old_shmctl(int shmid, int cmd, struct shmid_ds __user *buf)
1298 {
1299         int version = ipc_parse_version(&cmd);
1300 
1301         return ksys_shmctl(shmid, cmd, buf, version);
1302 }
1303 
1304 SYSCALL_DEFINE3(old_shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
1305 {
1306         return ksys_old_shmctl(shmid, cmd, buf);
1307 }
1308 #endif
1309 
1310 #ifdef CONFIG_COMPAT
1311 
1312 struct compat_shmid_ds {
1313         struct compat_ipc_perm shm_perm;
1314         int shm_segsz;
1315         old_time32_t shm_atime;
1316         old_time32_t shm_dtime;
1317         old_time32_t shm_ctime;
1318         compat_ipc_pid_t shm_cpid;
1319         compat_ipc_pid_t shm_lpid;
1320         unsigned short shm_nattch;
1321         unsigned short shm_unused;
1322         compat_uptr_t shm_unused2;
1323         compat_uptr_t shm_unused3;
1324 };
1325 
1326 struct compat_shminfo64 {
1327         compat_ulong_t shmmax;
1328         compat_ulong_t shmmin;
1329         compat_ulong_t shmmni;
1330         compat_ulong_t shmseg;
1331         compat_ulong_t shmall;
1332         compat_ulong_t __unused1;
1333         compat_ulong_t __unused2;
1334         compat_ulong_t __unused3;
1335         compat_ulong_t __unused4;
1336 };
1337 
1338 struct compat_shm_info {
1339         compat_int_t used_ids;
1340         compat_ulong_t shm_tot, shm_rss, shm_swp;
1341         compat_ulong_t swap_attempts, swap_successes;
1342 };
1343 
1344 static int copy_compat_shminfo_to_user(void __user *buf, struct shminfo64 *in,
1345                                         int version)
1346 {
1347         if (in->shmmax > INT_MAX)
1348                 in->shmmax = INT_MAX;
1349         if (version == IPC_64) {
1350                 struct compat_shminfo64 info;
1351                 memset(&info, 0, sizeof(info));
1352                 info.shmmax = in->shmmax;
1353                 info.shmmin = in->shmmin;
1354                 info.shmmni = in->shmmni;
1355                 info.shmseg = in->shmseg;
1356                 info.shmall = in->shmall;
1357                 return copy_to_user(buf, &info, sizeof(info));
1358         } else {
1359                 struct shminfo info;
1360                 memset(&info, 0, sizeof(info));
1361                 info.shmmax = in->shmmax;
1362                 info.shmmin = in->shmmin;
1363                 info.shmmni = in->shmmni;
1364                 info.shmseg = in->shmseg;
1365                 info.shmall = in->shmall;
1366                 return copy_to_user(buf, &info, sizeof(info));
1367         }
1368 }
1369 
1370 static int put_compat_shm_info(struct shm_info *ip,
1371                                 struct compat_shm_info __user *uip)
1372 {
1373         struct compat_shm_info info;
1374 
1375         memset(&info, 0, sizeof(info));
1376         info.used_ids = ip->used_ids;
1377         info.shm_tot = ip->shm_tot;
1378         info.shm_rss = ip->shm_rss;
1379         info.shm_swp = ip->shm_swp;
1380         info.swap_attempts = ip->swap_attempts;
1381         info.swap_successes = ip->swap_successes;
1382         return copy_to_user(uip, &info, sizeof(info));
1383 }
1384 
1385 static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,
1386                                         int version)
1387 {
1388         if (version == IPC_64) {
1389                 struct compat_shmid64_ds v;
1390                 memset(&v, 0, sizeof(v));
1391                 to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm);
1392                 v.shm_atime      = lower_32_bits(in->shm_atime);
1393                 v.shm_atime_high = upper_32_bits(in->shm_atime);
1394                 v.shm_dtime      = lower_32_bits(in->shm_dtime);
1395                 v.shm_dtime_high = upper_32_bits(in->shm_dtime);
1396                 v.shm_ctime      = lower_32_bits(in->shm_ctime);
1397                 v.shm_ctime_high = upper_32_bits(in->shm_ctime);
1398                 v.shm_segsz = in->shm_segsz;
1399                 v.shm_nattch = in->shm_nattch;
1400                 v.shm_cpid = in->shm_cpid;
1401                 v.shm_lpid = in->shm_lpid;
1402                 return copy_to_user(buf, &v, sizeof(v));
1403         } else {
1404                 struct compat_shmid_ds v;
1405                 memset(&v, 0, sizeof(v));
1406                 to_compat_ipc_perm(&v.shm_perm, &in->shm_perm);
1407                 v.shm_perm.key = in->shm_perm.key;
1408                 v.shm_atime = in->shm_atime;
1409                 v.shm_dtime = in->shm_dtime;
1410                 v.shm_ctime = in->shm_ctime;
1411                 v.shm_segsz = in->shm_segsz;
1412                 v.shm_nattch = in->shm_nattch;
1413                 v.shm_cpid = in->shm_cpid;
1414                 v.shm_lpid = in->shm_lpid;
1415                 return copy_to_user(buf, &v, sizeof(v));
1416         }
1417 }
1418 
1419 static int copy_compat_shmid_from_user(struct shmid64_ds *out, void __user *buf,
1420                                         int version)
1421 {
1422         memset(out, 0, sizeof(*out));
1423         if (version == IPC_64) {
1424                 struct compat_shmid64_ds __user *p = buf;
1425                 return get_compat_ipc64_perm(&out->shm_perm, &p->shm_perm);
1426         } else {
1427                 struct compat_shmid_ds __user *p = buf;
1428                 return get_compat_ipc_perm(&out->shm_perm, &p->shm_perm);
1429         }
1430 }
1431 
1432 static long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr, int version)
1433 {
1434         struct ipc_namespace *ns;
1435         struct shmid64_ds sem64;
1436         int err;
1437 
1438         ns = current->nsproxy->ipc_ns;
1439 
1440         if (cmd < 0 || shmid < 0)
1441                 return -EINVAL;
1442 
1443         switch (cmd) {
1444         case IPC_INFO: {
1445                 struct shminfo64 shminfo;
1446                 err = shmctl_ipc_info(ns, &shminfo);
1447                 if (err < 0)
1448                         return err;
1449                 if (copy_compat_shminfo_to_user(uptr, &shminfo, version))
1450                         err = -EFAULT;
1451                 return err;
1452         }
1453         case SHM_INFO: {
1454                 struct shm_info shm_info;
1455                 err = shmctl_shm_info(ns, &shm_info);
1456                 if (err < 0)
1457                         return err;
1458                 if (put_compat_shm_info(&shm_info, uptr))
1459                         err = -EFAULT;
1460                 return err;
1461         }
1462         case IPC_STAT:
1463         case SHM_STAT_ANY:
1464         case SHM_STAT:
1465                 err = shmctl_stat(ns, shmid, cmd, &sem64);
1466                 if (err < 0)
1467                         return err;
1468                 if (copy_compat_shmid_to_user(uptr, &sem64, version))
1469                         err = -EFAULT;
1470                 return err;
1471 
1472         case IPC_SET:
1473                 if (copy_compat_shmid_from_user(&sem64, uptr, version))
1474                         return -EFAULT;
1475                 fallthrough;
1476         case IPC_RMID:
1477                 return shmctl_down(ns, shmid, cmd, &sem64);
1478         case SHM_LOCK:
1479         case SHM_UNLOCK:
1480                 return shmctl_do_lock(ns, shmid, cmd);
1481         default:
1482                 return -EINVAL;
1483         }
1484         return err;
1485 }
1486 
1487 COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr)
1488 {
1489         return compat_ksys_shmctl(shmid, cmd, uptr, IPC_64);
1490 }
1491 
1492 #ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
1493 long compat_ksys_old_shmctl(int shmid, int cmd, void __user *uptr)
1494 {
1495         int version = compat_ipc_parse_version(&cmd);
1496 
1497         return compat_ksys_shmctl(shmid, cmd, uptr, version);
1498 }
1499 
1500 COMPAT_SYSCALL_DEFINE3(old_shmctl, int, shmid, int, cmd, void __user *, uptr)
1501 {
1502         return compat_ksys_old_shmctl(shmid, cmd, uptr);
1503 }
1504 #endif
1505 #endif
1506 
1507 /*
1508  * Fix shmaddr, allocate descriptor, map shm, add attach descriptor to lists.
1509  *
1510  * NOTE! Despite the name, this is NOT a direct system call entrypoint. The
1511  * "raddr" thing points to kernel space, and there has to be a wrapper around
1512  * this.
1513  */
1514 long do_shmat(int shmid, char __user *shmaddr, int shmflg,
1515               ulong *raddr, unsigned long shmlba)
1516 {
1517         struct shmid_kernel *shp;
1518         unsigned long addr = (unsigned long)shmaddr;
1519         unsigned long size;
1520         struct file *file, *base;
1521         int    err;
1522         unsigned long flags = MAP_SHARED;
1523         unsigned long prot;
1524         int acc_mode;
1525         struct ipc_namespace *ns;
1526         struct shm_file_data *sfd;
1527         int f_flags;
1528         unsigned long populate = 0;
1529 
1530         err = -EINVAL;
1531         if (shmid < 0)
1532                 goto out;
1533 
1534         if (addr) {
1535                 if (addr & (shmlba - 1)) {
1536                         if (shmflg & SHM_RND) {
1537                                 addr &= ~(shmlba - 1);  /* round down */
1538 
1539                                 /*
1540                                  * Ensure that the round-down is non-nil
1541                                  * when remapping. This can happen for
1542                                  * cases when addr < shmlba.
1543                                  */
1544                                 if (!addr && (shmflg & SHM_REMAP))
1545                                         goto out;
1546                         } else
1547 #ifndef __ARCH_FORCE_SHMLBA
1548                                 if (addr & ~PAGE_MASK)
1549 #endif
1550                                         goto out;
1551                 }
1552 
1553                 flags |= MAP_FIXED;
1554         } else if ((shmflg & SHM_REMAP))
1555                 goto out;
1556 
1557         if (shmflg & SHM_RDONLY) {
1558                 prot = PROT_READ;
1559                 acc_mode = S_IRUGO;
1560                 f_flags = O_RDONLY;
1561         } else {
1562                 prot = PROT_READ | PROT_WRITE;
1563                 acc_mode = S_IRUGO | S_IWUGO;
1564                 f_flags = O_RDWR;
1565         }
1566         if (shmflg & SHM_EXEC) {
1567                 prot |= PROT_EXEC;
1568                 acc_mode |= S_IXUGO;
1569         }
1570 
1571         /*
1572          * We cannot rely on the fs check since SYSV IPC does have an
1573          * additional creator id...
1574          */
1575         ns = current->nsproxy->ipc_ns;
1576         rcu_read_lock();
1577         shp = shm_obtain_object_check(ns, shmid);
1578         if (IS_ERR(shp)) {
1579                 err = PTR_ERR(shp);
1580                 goto out_unlock;
1581         }
1582 
1583         err = -EACCES;
1584         if (ipcperms(ns, &shp->shm_perm, acc_mode))
1585                 goto out_unlock;
1586 
1587         err = security_shm_shmat(&shp->shm_perm, shmaddr, shmflg);
1588         if (err)
1589                 goto out_unlock;
1590 
1591         ipc_lock_object(&shp->shm_perm);
1592 
1593         /* check if shm_destroy() is tearing down shp */
1594         if (!ipc_valid_object(&shp->shm_perm)) {
1595                 ipc_unlock_object(&shp->shm_perm);
1596                 err = -EIDRM;
1597                 goto out_unlock;
1598         }
1599 
1600         /*
1601          * We need to take a reference to the real shm file to prevent the
1602          * pointer from becoming stale in cases where the lifetime of the outer
1603          * file extends beyond that of the shm segment.  It's not usually
1604          * possible, but it can happen during remap_file_pages() emulation as
1605          * that unmaps the memory, then does ->mmap() via file reference only.
1606          * We'll deny the ->mmap() if the shm segment was since removed, but to
1607          * detect shm ID reuse we need to compare the file pointers.
1608          */
1609         base = get_file(shp->shm_file);
1610         shp->shm_nattch++;
1611         size = i_size_read(file_inode(base));
1612         ipc_unlock_object(&shp->shm_perm);
1613         rcu_read_unlock();
1614 
1615         err = -ENOMEM;
1616         sfd = kzalloc(sizeof(*sfd), GFP_KERNEL);
1617         if (!sfd) {
1618                 fput(base);
1619                 goto out_nattch;
1620         }
1621 
1622         file = alloc_file_clone(base, f_flags,
1623                           is_file_hugepages(base) ?
1624                                 &shm_file_operations_huge :
1625                                 &shm_file_operations);
1626         err = PTR_ERR(file);
1627         if (IS_ERR(file)) {
1628                 kfree(sfd);
1629                 fput(base);
1630                 goto out_nattch;
1631         }
1632 
1633         sfd->id = shp->shm_perm.id;
1634         sfd->ns = get_ipc_ns(ns);
1635         sfd->file = base;
1636         sfd->vm_ops = NULL;
1637         file->private_data = sfd;
1638 
1639         err = security_mmap_file(file, prot, flags);
1640         if (err)
1641                 goto out_fput;
1642 
1643         if (mmap_write_lock_killable(current->mm)) {
1644                 err = -EINTR;
1645                 goto out_fput;
1646         }
1647 
1648         if (addr && !(shmflg & SHM_REMAP)) {
1649                 err = -EINVAL;
1650                 if (addr + size < addr)
1651                         goto invalid;
1652 
1653                 if (find_vma_intersection(current->mm, addr, addr + size))
1654                         goto invalid;
1655         }
1656 
1657         addr = do_mmap(file, addr, size, prot, flags, 0, 0, &populate, NULL);
1658         *raddr = addr;
1659         err = 0;
1660         if (IS_ERR_VALUE(addr))
1661                 err = (long)addr;
1662 invalid:
1663         mmap_write_unlock(current->mm);
1664         if (populate)
1665                 mm_populate(addr, populate);
1666 
1667 out_fput:
1668         fput(file);
1669 
1670 out_nattch:
1671         down_write(&shm_ids(ns).rwsem);
1672         shp = shm_lock(ns, shmid);
1673         shp->shm_nattch--;
1674 
1675         if (shm_may_destroy(shp))
1676                 shm_destroy(ns, shp);
1677         else
1678                 shm_unlock(shp);
1679         up_write(&shm_ids(ns).rwsem);
1680         return err;
1681 
1682 out_unlock:
1683         rcu_read_unlock();
1684 out:
1685         return err;
1686 }
1687 
1688 SYSCALL_DEFINE3(shmat, int, shmid, char __user *, shmaddr, int, shmflg)
1689 {
1690         unsigned long ret;
1691         long err;
1692 
1693         err = do_shmat(shmid, shmaddr, shmflg, &ret, SHMLBA);
1694         if (err)
1695                 return err;
1696         force_successful_syscall_return();
1697         return (long)ret;
1698 }
1699 
1700 #ifdef CONFIG_COMPAT
1701 
1702 #ifndef COMPAT_SHMLBA
1703 #define COMPAT_SHMLBA   SHMLBA
1704 #endif
1705 
1706 COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
1707 {
1708         unsigned long ret;
1709         long err;
1710 
1711         err = do_shmat(shmid, compat_ptr(shmaddr), shmflg, &ret, COMPAT_SHMLBA);
1712         if (err)
1713                 return err;
1714         force_successful_syscall_return();
1715         return (long)ret;
1716 }
1717 #endif
1718 
1719 /*
1720  * detach and kill segment if marked destroyed.
1721  * The work is done in shm_close.
1722  */
1723 long ksys_shmdt(char __user *shmaddr)
1724 {
1725         struct mm_struct *mm = current->mm;
1726         struct vm_area_struct *vma;
1727         unsigned long addr = (unsigned long)shmaddr;
1728         int retval = -EINVAL;
1729 #ifdef CONFIG_MMU
1730         loff_t size = 0;
1731         struct file *file;
1732         VMA_ITERATOR(vmi, mm, addr);
1733 #endif
1734 
1735         if (addr & ~PAGE_MASK)
1736                 return retval;
1737 
1738         if (mmap_write_lock_killable(mm))
1739                 return -EINTR;
1740 
1741         /*
1742          * This function tries to be smart and unmap shm segments that
1743          * were modified by partial mlock or munmap calls:
1744          * - It first determines the size of the shm segment that should be
1745          *   unmapped: It searches for a vma that is backed by shm and that
1746          *   started at address shmaddr. It records it's size and then unmaps
1747          *   it.
1748          * - Then it unmaps all shm vmas that started at shmaddr and that
1749          *   are within the initially determined size and that are from the
1750          *   same shm segment from which we determined the size.
1751          * Errors from do_munmap are ignored: the function only fails if
1752          * it's called with invalid parameters or if it's called to unmap
1753          * a part of a vma. Both calls in this function are for full vmas,
1754          * the parameters are directly copied from the vma itself and always
1755          * valid - therefore do_munmap cannot fail. (famous last words?)
1756          */
1757         /*
1758          * If it had been mremap()'d, the starting address would not
1759          * match the usual checks anyway. So assume all vma's are
1760          * above the starting address given.
1761          */
1762 
1763 #ifdef CONFIG_MMU
1764         for_each_vma(vmi, vma) {
1765                 /*
1766                  * Check if the starting address would match, i.e. it's
1767                  * a fragment created by mprotect() and/or munmap(), or it
1768                  * otherwise it starts at this address with no hassles.
1769                  */
1770                 if ((vma->vm_ops == &shm_vm_ops) &&
1771                         (vma->vm_start - addr)/PAGE_SIZE == vma->vm_pgoff) {
1772 
1773                         /*
1774                          * Record the file of the shm segment being
1775                          * unmapped.  With mremap(), someone could place
1776                          * page from another segment but with equal offsets
1777                          * in the range we are unmapping.
1778                          */
1779                         file = vma->vm_file;
1780                         size = i_size_read(file_inode(vma->vm_file));
1781                         do_vma_munmap(&vmi, vma, vma->vm_start, vma->vm_end,
1782                                       NULL, false);
1783                         /*
1784                          * We discovered the size of the shm segment, so
1785                          * break out of here and fall through to the next
1786                          * loop that uses the size information to stop
1787                          * searching for matching vma's.
1788                          */
1789                         retval = 0;
1790                         vma = vma_next(&vmi);
1791                         break;
1792                 }
1793         }
1794 
1795         /*
1796          * We need look no further than the maximum address a fragment
1797          * could possibly have landed at. Also cast things to loff_t to
1798          * prevent overflows and make comparisons vs. equal-width types.
1799          */
1800         size = PAGE_ALIGN(size);
1801         while (vma && (loff_t)(vma->vm_end - addr) <= size) {
1802                 /* finding a matching vma now does not alter retval */
1803                 if ((vma->vm_ops == &shm_vm_ops) &&
1804                     ((vma->vm_start - addr)/PAGE_SIZE == vma->vm_pgoff) &&
1805                     (vma->vm_file == file)) {
1806                         do_vma_munmap(&vmi, vma, vma->vm_start, vma->vm_end,
1807                                       NULL, false);
1808                 }
1809 
1810                 vma = vma_next(&vmi);
1811         }
1812 
1813 #else   /* CONFIG_MMU */
1814         vma = vma_lookup(mm, addr);
1815         /* under NOMMU conditions, the exact address to be destroyed must be
1816          * given
1817          */
1818         if (vma && vma->vm_start == addr && vma->vm_ops == &shm_vm_ops) {
1819                 do_munmap(mm, vma->vm_start, vma->vm_end - vma->vm_start, NULL);
1820                 retval = 0;
1821         }
1822 
1823 #endif
1824 
1825         mmap_write_unlock(mm);
1826         return retval;
1827 }
1828 
1829 SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
1830 {
1831         return ksys_shmdt(shmaddr);
1832 }
1833 
1834 #ifdef CONFIG_PROC_FS
1835 static int sysvipc_shm_proc_show(struct seq_file *s, void *it)
1836 {
1837         struct pid_namespace *pid_ns = ipc_seq_pid_ns(s);
1838         struct user_namespace *user_ns = seq_user_ns(s);
1839         struct kern_ipc_perm *ipcp = it;
1840         struct shmid_kernel *shp;
1841         unsigned long rss = 0, swp = 0;
1842 
1843         shp = container_of(ipcp, struct shmid_kernel, shm_perm);
1844         shm_add_rss_swap(shp, &rss, &swp);
1845 
1846 #if BITS_PER_LONG <= 32
1847 #define SIZE_SPEC "%10lu"
1848 #else
1849 #define SIZE_SPEC "%21lu"
1850 #endif
1851 
1852         seq_printf(s,
1853                    "%10d %10d  %4o " SIZE_SPEC " %5u %5u  "
1854                    "%5lu %5u %5u %5u %5u %10llu %10llu %10llu "
1855                    SIZE_SPEC " " SIZE_SPEC "\n",
1856                    shp->shm_perm.key,
1857                    shp->shm_perm.id,
1858                    shp->shm_perm.mode,
1859                    shp->shm_segsz,
1860                    pid_nr_ns(shp->shm_cprid, pid_ns),
1861                    pid_nr_ns(shp->shm_lprid, pid_ns),
1862                    shp->shm_nattch,
1863                    from_kuid_munged(user_ns, shp->shm_perm.uid),
1864                    from_kgid_munged(user_ns, shp->shm_perm.gid),
1865                    from_kuid_munged(user_ns, shp->shm_perm.cuid),
1866                    from_kgid_munged(user_ns, shp->shm_perm.cgid),
1867                    shp->shm_atim,
1868                    shp->shm_dtim,
1869                    shp->shm_ctim,
1870                    rss * PAGE_SIZE,
1871                    swp * PAGE_SIZE);
1872 
1873         return 0;
1874 }
1875 #endif
1876 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php