linux/include/linux/ipc_namespace.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __IPC_NAMESPACE_H__
   3#define __IPC_NAMESPACE_H__
   4
   5#include <linux/err.h>
   6#include <linux/idr.h>
   7#include <linux/rwsem.h>
   8#include <linux/notifier.h>
   9#include <linux/nsproxy.h>
  10#include <linux/ns_common.h>
  11#include <linux/refcount.h>
  12#include <linux/rhashtable-types.h>
  13
  14struct user_namespace;
  15
  16struct ipc_ids {
  17        int in_use;
  18        unsigned short seq;
  19        struct rw_semaphore rwsem;
  20        struct idr ipcs_idr;
  21        int max_idx;
  22        int last_idx;   /* For wrap around detection */
  23#ifdef CONFIG_CHECKPOINT_RESTORE
  24        int next_id;
  25#endif
  26        struct rhashtable key_ht;
  27};
  28
  29struct ipc_namespace {
  30        refcount_t      count;
  31        struct ipc_ids  ids[3];
  32
  33        int             sem_ctls[4];
  34        int             used_sems;
  35
  36        unsigned int    msg_ctlmax;
  37        unsigned int    msg_ctlmnb;
  38        unsigned int    msg_ctlmni;
  39        atomic_t        msg_bytes;
  40        atomic_t        msg_hdrs;
  41
  42        size_t          shm_ctlmax;
  43        size_t          shm_ctlall;
  44        unsigned long   shm_tot;
  45        int             shm_ctlmni;
  46        /*
  47         * Defines whether IPC_RMID is forced for _all_ shm segments regardless
  48         * of shmctl()
  49         */
  50        int             shm_rmid_forced;
  51
  52        struct notifier_block ipcns_nb;
  53
  54        /* The kern_mount of the mqueuefs sb.  We take a ref on it */
  55        struct vfsmount *mq_mnt;
  56
  57        /* # queues in this ns, protected by mq_lock */
  58        unsigned int    mq_queues_count;
  59
  60        /* next fields are set through sysctl */
  61        unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
  62        unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
  63        unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
  64        unsigned int    mq_msg_default;
  65        unsigned int    mq_msgsize_default;
  66
  67        /* user_ns which owns the ipc ns */
  68        struct user_namespace *user_ns;
  69        struct ucounts *ucounts;
  70
  71        struct ns_common ns;
  72} __randomize_layout;
  73
  74extern struct ipc_namespace init_ipc_ns;
  75extern spinlock_t mq_lock;
  76
  77#ifdef CONFIG_SYSVIPC
  78extern void shm_destroy_orphaned(struct ipc_namespace *ns);
  79#else /* CONFIG_SYSVIPC */
  80static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {}
  81#endif /* CONFIG_SYSVIPC */
  82
  83#ifdef CONFIG_POSIX_MQUEUE
  84extern int mq_init_ns(struct ipc_namespace *ns);
  85/*
  86 * POSIX Message Queue default values:
  87 *
  88 * MIN_*: Lowest value an admin can set the maximum unprivileged limit to
  89 * DFLT_*MAX: Default values for the maximum unprivileged limits
  90 * DFLT_{MSG,MSGSIZE}: Default values used when the user doesn't supply
  91 *   an attribute to the open call and the queue must be created
  92 * HARD_*: Highest value the maximums can be set to.  These are enforced
  93 *   on CAP_SYS_RESOURCE apps as well making them inviolate (so make them
  94 *   suitably high)
  95 *
  96 * POSIX Requirements:
  97 *   Per app minimum openable message queues - 8.  This does not map well
  98 *     to the fact that we limit the number of queues on a per namespace
  99 *     basis instead of a per app basis.  So, make the default high enough
 100 *     that no given app should have a hard time opening 8 queues.
 101 *   Minimum maximum for HARD_MSGMAX - 32767.  I bumped this to 65536.
 102 *   Minimum maximum for HARD_MSGSIZEMAX - POSIX is silent on this.  However,
 103 *     we have run into a situation where running applications in the wild
 104 *     require this to be at least 5MB, and preferably 10MB, so I set the
 105 *     value to 16MB in hopes that this user is the worst of the bunch and
 106 *     the new maximum will handle anyone else.  I may have to revisit this
 107 *     in the future.
 108 */
 109#define DFLT_QUEUESMAX                256
 110#define MIN_MSGMAX                      1
 111#define DFLT_MSG                       10U
 112#define DFLT_MSGMAX                    10
 113#define HARD_MSGMAX                 65536
 114#define MIN_MSGSIZEMAX                128
 115#define DFLT_MSGSIZE                 8192U
 116#define DFLT_MSGSIZEMAX              8192
 117#define HARD_MSGSIZEMAX     (16*1024*1024)
 118#else
 119static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
 120#endif
 121
 122#if defined(CONFIG_IPC_NS)
 123extern struct ipc_namespace *copy_ipcs(unsigned long flags,
 124        struct user_namespace *user_ns, struct ipc_namespace *ns);
 125
 126static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 127{
 128        if (ns)
 129                refcount_inc(&ns->count);
 130        return ns;
 131}
 132
 133extern void put_ipc_ns(struct ipc_namespace *ns);
 134#else
 135static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
 136        struct user_namespace *user_ns, struct ipc_namespace *ns)
 137{
 138        if (flags & CLONE_NEWIPC)
 139                return ERR_PTR(-EINVAL);
 140
 141        return ns;
 142}
 143
 144static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 145{
 146        return ns;
 147}
 148
 149static inline void put_ipc_ns(struct ipc_namespace *ns)
 150{
 151}
 152#endif
 153
 154#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
 155
 156struct ctl_table_header;
 157extern struct ctl_table_header *mq_register_sysctl_table(void);
 158
 159#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
 160
 161static inline struct ctl_table_header *mq_register_sysctl_table(void)
 162{
 163        return NULL;
 164}
 165
 166#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
 167#endif
 168