ipc: conserve sequence numbers in ipcmni_extend mode
[linux-2.6-block.git] / ipc / util.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * linux/ipc/util.h
4  * Copyright (C) 1999 Christoph Rohland
5  *
6  * ipc helper functions (c) 1999 Manfred Spraul <manfred@colorfullife.com>
7  * namespaces support.      2006 OpenVZ, SWsoft Inc.
8  *                               Pavel Emelianov <xemul@openvz.org>
9  */
10
11 #ifndef _IPC_UTIL_H
12 #define _IPC_UTIL_H
13
14 #include <linux/unistd.h>
15 #include <linux/err.h>
16 #include <linux/ipc_namespace.h>
17
18 /*
19  * The IPC ID contains 2 separate numbers - index and sequence number.
20  * By default,
21  *   bits  0-14: index (32k, 15 bits)
22  *   bits 15-30: sequence number (64k, 16 bits)
23  *
24  * When IPCMNI extension mode is turned on, the composition changes:
25  *   bits  0-23: index (16M, 24 bits)
26  *   bits 24-30: sequence number (128, 7 bits)
27  */
28 #define IPCMNI_SHIFT            15
29 #define IPCMNI_EXTEND_SHIFT     24
30 #define IPCMNI                  (1 << IPCMNI_SHIFT)
31 #define IPCMNI_EXTEND           (1 << IPCMNI_EXTEND_SHIFT)
32
33 #ifdef CONFIG_SYSVIPC_SYSCTL
34 extern int ipc_mni;
35 extern int ipc_mni_shift;
36
37 #define ipcmni_seq_shift()      ipc_mni_shift
38 #define IPCMNI_IDX_MASK         ((1 << ipc_mni_shift) - 1)
39
40 #else /* CONFIG_SYSVIPC_SYSCTL */
41
42 #define ipc_mni                 IPCMNI
43 #define ipcmni_seq_shift()      IPCMNI_SHIFT
44 #define IPCMNI_IDX_MASK         ((1 << IPCMNI_SHIFT) - 1)
45 #endif /* CONFIG_SYSVIPC_SYSCTL */
46
47 void sem_init(void);
48 void msg_init(void);
49 void shm_init(void);
50
51 struct ipc_namespace;
52 struct pid_namespace;
53
54 #ifdef CONFIG_POSIX_MQUEUE
55 extern void mq_clear_sbinfo(struct ipc_namespace *ns);
56 extern void mq_put_mnt(struct ipc_namespace *ns);
57 #else
58 static inline void mq_clear_sbinfo(struct ipc_namespace *ns) { }
59 static inline void mq_put_mnt(struct ipc_namespace *ns) { }
60 #endif
61
62 #ifdef CONFIG_SYSVIPC
63 void sem_init_ns(struct ipc_namespace *ns);
64 void msg_init_ns(struct ipc_namespace *ns);
65 void shm_init_ns(struct ipc_namespace *ns);
66
67 void sem_exit_ns(struct ipc_namespace *ns);
68 void msg_exit_ns(struct ipc_namespace *ns);
69 void shm_exit_ns(struct ipc_namespace *ns);
70 #else
71 static inline void sem_init_ns(struct ipc_namespace *ns) { }
72 static inline void msg_init_ns(struct ipc_namespace *ns) { }
73 static inline void shm_init_ns(struct ipc_namespace *ns) { }
74
75 static inline void sem_exit_ns(struct ipc_namespace *ns) { }
76 static inline void msg_exit_ns(struct ipc_namespace *ns) { }
77 static inline void shm_exit_ns(struct ipc_namespace *ns) { }
78 #endif
79
80 /*
81  * Structure that holds the parameters needed by the ipc operations
82  * (see after)
83  */
84 struct ipc_params {
85         key_t key;
86         int flg;
87         union {
88                 size_t size;    /* for shared memories */
89                 int nsems;      /* for semaphores */
90         } u;                    /* holds the getnew() specific param */
91 };
92
93 /*
94  * Structure that holds some ipc operations. This structure is used to unify
95  * the calls to sys_msgget(), sys_semget(), sys_shmget()
96  *      . routine to call to create a new ipc object. Can be one of newque,
97  *        newary, newseg
98  *      . routine to call to check permissions for a new ipc object.
99  *        Can be one of security_msg_associate, security_sem_associate,
100  *        security_shm_associate
101  *      . routine to call for an extra check if needed
102  */
103 struct ipc_ops {
104         int (*getnew)(struct ipc_namespace *, struct ipc_params *);
105         int (*associate)(struct kern_ipc_perm *, int);
106         int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *);
107 };
108
109 struct seq_file;
110 struct ipc_ids;
111
112 void ipc_init_ids(struct ipc_ids *ids);
113 #ifdef CONFIG_PROC_FS
114 void __init ipc_init_proc_interface(const char *path, const char *header,
115                 int ids, int (*show)(struct seq_file *, void *));
116 struct pid_namespace *ipc_seq_pid_ns(struct seq_file *);
117 #else
118 #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
119 #endif
120
121 #define IPC_SEM_IDS     0
122 #define IPC_MSG_IDS     1
123 #define IPC_SHM_IDS     2
124
125 #define ipcid_to_idx(id)  ((id) & IPCMNI_IDX_MASK)
126 #define ipcid_to_seqx(id) ((id) >> ipcmni_seq_shift())
127 #define ipcid_seq_max()   (INT_MAX >> ipcmni_seq_shift())
128
129 /* must be called with ids->rwsem acquired for writing */
130 int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
131
132 /* must be called with both locks acquired. */
133 void ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *);
134
135 /* must be called with both locks acquired. */
136 void ipc_set_key_private(struct ipc_ids *, struct kern_ipc_perm *);
137
138 /* must be called with ipcp locked */
139 int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg);
140
141 /**
142  * ipc_get_maxidx - get the highest assigned index
143  * @ids: ipc identifier set
144  *
145  * Called with ipc_ids.rwsem held for reading.
146  */
147 static inline int ipc_get_maxidx(struct ipc_ids *ids)
148 {
149         if (ids->in_use == 0)
150                 return -1;
151
152         if (ids->in_use == ipc_mni)
153                 return ipc_mni - 1;
154
155         return ids->max_idx;
156 }
157
158 /*
159  * For allocation that need to be freed by RCU.
160  * Objects are reference counted, they start with reference count 1.
161  * getref increases the refcount, the putref call that reduces the recount
162  * to 0 schedules the rcu destruction. Caller must guarantee locking.
163  *
164  * refcount is initialized by ipc_addid(), before that point call_rcu()
165  * must be used.
166  */
167 bool ipc_rcu_getref(struct kern_ipc_perm *ptr);
168 void ipc_rcu_putref(struct kern_ipc_perm *ptr,
169                         void (*func)(struct rcu_head *head));
170
171 struct kern_ipc_perm *ipc_obtain_object_idr(struct ipc_ids *ids, int id);
172
173 void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
174 void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
175 int ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out);
176 struct kern_ipc_perm *ipcctl_obtain_check(struct ipc_namespace *ns,
177                                              struct ipc_ids *ids, int id, int cmd,
178                                              struct ipc64_perm *perm, int extra_perm);
179
180 static inline void ipc_update_pid(struct pid **pos, struct pid *pid)
181 {
182         struct pid *old = *pos;
183         if (old != pid) {
184                 *pos = get_pid(pid);
185                 put_pid(old);
186         }
187 }
188
189 #ifdef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
190 int ipc_parse_version(int *cmd);
191 #endif
192
193 extern void free_msg(struct msg_msg *msg);
194 extern struct msg_msg *load_msg(const void __user *src, size_t len);
195 extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst);
196 extern int store_msg(void __user *dest, struct msg_msg *msg, size_t len);
197
198 static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int id)
199 {
200         return ipcid_to_seqx(id) != ipcp->seq;
201 }
202
203 static inline void ipc_lock_object(struct kern_ipc_perm *perm)
204 {
205         spin_lock(&perm->lock);
206 }
207
208 static inline void ipc_unlock_object(struct kern_ipc_perm *perm)
209 {
210         spin_unlock(&perm->lock);
211 }
212
213 static inline void ipc_assert_locked_object(struct kern_ipc_perm *perm)
214 {
215         assert_spin_locked(&perm->lock);
216 }
217
218 static inline void ipc_unlock(struct kern_ipc_perm *perm)
219 {
220         ipc_unlock_object(perm);
221         rcu_read_unlock();
222 }
223
224 /*
225  * ipc_valid_object() - helper to sort out IPC_RMID races for codepaths
226  * where the respective ipc_ids.rwsem is not being held down.
227  * Checks whether the ipc object is still around or if it's gone already, as
228  * ipc_rmid() may have already freed the ID while the ipc lock was spinning.
229  * Needs to be called with kern_ipc_perm.lock held -- exception made for one
230  * checkpoint case at sys_semtimedop() as noted in code commentary.
231  */
232 static inline bool ipc_valid_object(struct kern_ipc_perm *perm)
233 {
234         return !perm->deleted;
235 }
236
237 struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id);
238 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
239                         const struct ipc_ops *ops, struct ipc_params *params);
240 void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
241                 void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
242
243 static inline int sem_check_semmni(struct ipc_namespace *ns) {
244         /*
245          * Check semmni range [0, ipc_mni]
246          * semmni is the last element of sem_ctls[4] array
247          */
248         return ((ns->sem_ctls[3] < 0) || (ns->sem_ctls[3] > ipc_mni))
249                 ? -ERANGE : 0;
250 }
251
252 #ifdef CONFIG_COMPAT
253 #include <linux/compat.h>
254 struct compat_ipc_perm {
255         key_t key;
256         __compat_uid_t uid;
257         __compat_gid_t gid;
258         __compat_uid_t cuid;
259         __compat_gid_t cgid;
260         compat_mode_t mode;
261         unsigned short seq;
262 };
263
264 void to_compat_ipc_perm(struct compat_ipc_perm *, struct ipc64_perm *);
265 void to_compat_ipc64_perm(struct compat_ipc64_perm *, struct ipc64_perm *);
266 int get_compat_ipc_perm(struct ipc64_perm *, struct compat_ipc_perm __user *);
267 int get_compat_ipc64_perm(struct ipc64_perm *,
268                           struct compat_ipc64_perm __user *);
269
270 static inline int compat_ipc_parse_version(int *cmd)
271 {
272         int version = *cmd & IPC_64;
273         *cmd &= ~IPC_64;
274         return version;
275 }
276 #endif
277
278 /* for __ARCH_WANT_SYS_IPC */
279 long ksys_semtimedop(int semid, struct sembuf __user *tsops,
280                      unsigned int nsops,
281                      const struct __kernel_timespec __user *timeout);
282 long ksys_semget(key_t key, int nsems, int semflg);
283 long ksys_old_semctl(int semid, int semnum, int cmd, unsigned long arg);
284 long ksys_msgget(key_t key, int msgflg);
285 long ksys_old_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
286 long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
287                  long msgtyp, int msgflg);
288 long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
289                  int msgflg);
290 long ksys_shmget(key_t key, size_t size, int shmflg);
291 long ksys_shmdt(char __user *shmaddr);
292 long ksys_old_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
293
294 /* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
295 long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
296                             unsigned int nsops,
297                             const struct old_timespec32 __user *timeout);
298 #ifdef CONFIG_COMPAT
299 long compat_ksys_old_semctl(int semid, int semnum, int cmd, int arg);
300 long compat_ksys_old_msgctl(int msqid, int cmd, void __user *uptr);
301 long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
302                         compat_long_t msgtyp, int msgflg);
303 long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
304                        compat_ssize_t msgsz, int msgflg);
305 long compat_ksys_old_shmctl(int shmid, int cmd, void __user *uptr);
306 #endif /* CONFIG_COMPAT */
307
308 #endif