Branch data Line data Source code
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 : : 14 : : struct user_namespace; 15 : : 16 : : struct 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 : : 29 : : struct 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 : : 74 : : extern struct ipc_namespace init_ipc_ns; 75 : : extern spinlock_t mq_lock; 76 : : 77 : : #ifdef CONFIG_SYSVIPC 78 : : extern void shm_destroy_orphaned(struct ipc_namespace *ns); 79 : : #else /* CONFIG_SYSVIPC */ 80 : : static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {} 81 : : #endif /* CONFIG_SYSVIPC */ 82 : : 83 : : #ifdef CONFIG_POSIX_MQUEUE 84 : : extern 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 119 : : static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; } 120 : : #endif 121 : : 122 : : #if defined(CONFIG_IPC_NS) 123 : : extern struct ipc_namespace *copy_ipcs(unsigned long flags, 124 : : struct user_namespace *user_ns, struct ipc_namespace *ns); 125 : : 126 : 66 : static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) 127 : : { 128 [ - - + - : 66 : if (ns) + - - - ] 129 : 66 : refcount_inc(&ns->count); 130 [ - - ]: 66 : return ns; 131 : : } 132 : : 133 : : extern void put_ipc_ns(struct ipc_namespace *ns); 134 : : #else 135 : : static 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 : : 144 : : static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) 145 : : { 146 : : return ns; 147 : : } 148 : : 149 : : static inline void put_ipc_ns(struct ipc_namespace *ns) 150 : : { 151 : : } 152 : : #endif 153 : : 154 : : #ifdef CONFIG_POSIX_MQUEUE_SYSCTL 155 : : 156 : : struct ctl_table_header; 157 : : extern struct ctl_table_header *mq_register_sysctl_table(void); 158 : : 159 : : #else /* CONFIG_POSIX_MQUEUE_SYSCTL */ 160 : : 161 : : static inline struct ctl_table_header *mq_register_sysctl_table(void) 162 : : { 163 : : return NULL; 164 : : } 165 : : 166 : : #endif /* CONFIG_POSIX_MQUEUE_SYSCTL */ 167 : : #endif