Blame view
ipc/syscall.c
4.73 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
baed7fc9b Add generic sys_i... |
2 3 4 5 6 7 8 |
/* * sys_ipc() is the old de-multiplexer for the SysV IPC calls. * * This is really horribly ugly, and new architectures should just wire up * the individual syscalls instead. */ #include <linux/unistd.h> |
20bc2a3af ipc(2): move comp... |
9 |
#include <linux/syscalls.h> |
41f4f0e2f ipc: add semtimed... |
10 11 12 |
#include <linux/security.h> #include <linux/ipc_namespace.h> #include "util.h" |
baed7fc9b Add generic sys_i... |
13 14 15 16 17 |
#ifdef __ARCH_WANT_SYS_IPC #include <linux/errno.h> #include <linux/ipc.h> #include <linux/shm.h> |
baed7fc9b Add generic sys_i... |
18 |
#include <linux/uaccess.h> |
45575f5a4 ppc64 sys_ipc bre... |
19 |
SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, |
baed7fc9b Add generic sys_i... |
20 21 22 23 24 25 26 27 28 |
unsigned long, third, void __user *, ptr, long, fifth) { int version, ret; version = call >> 16; /* hack for backward compatibility */ call &= 0xffff; switch (call) { case SEMOP: |
41f4f0e2f ipc: add semtimed... |
29 30 |
return ksys_semtimedop(first, (struct sembuf __user *)ptr, second, NULL); |
baed7fc9b Add generic sys_i... |
31 |
case SEMTIMEDOP: |
5dc0b1529 y2038: ipc: Redir... |
32 33 34 35 36 37 38 39 |
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME)) return ksys_semtimedop(first, ptr, second, (const struct __kernel_timespec __user *)fifth); else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) return compat_ksys_semtimedop(first, ptr, second, (const struct compat_timespec __user *)fifth); else return -ENOSYS; |
baed7fc9b Add generic sys_i... |
40 41 |
case SEMGET: |
69894718a ipc: add semget s... |
42 |
return ksys_semget(first, second, third); |
baed7fc9b Add generic sys_i... |
43 |
case SEMCTL: { |
e1fd1f490 get rid of union ... |
44 |
unsigned long arg; |
baed7fc9b Add generic sys_i... |
45 46 |
if (!ptr) return -EINVAL; |
e1fd1f490 get rid of union ... |
47 |
if (get_user(arg, (unsigned long __user *) ptr)) |
baed7fc9b Add generic sys_i... |
48 |
return -EFAULT; |
d969c6fa7 ipc: add semctl s... |
49 |
return ksys_semctl(first, second, third, arg); |
baed7fc9b Add generic sys_i... |
50 51 52 |
} case MSGSND: |
31c213f21 ipc: add msgsnd s... |
53 |
return ksys_msgsnd(first, (struct msgbuf __user *) ptr, |
baed7fc9b Add generic sys_i... |
54 55 56 57 58 59 60 61 62 63 64 65 |
second, third); case MSGRCV: switch (version) { case 0: { struct ipc_kludge tmp; if (!ptr) return -EINVAL; if (copy_from_user(&tmp, (struct ipc_kludge __user *) ptr, sizeof(tmp))) return -EFAULT; |
078faac9e ipc: add msgrcv s... |
66 |
return ksys_msgrcv(first, tmp.msgp, second, |
baed7fc9b Add generic sys_i... |
67 68 69 |
tmp.msgtyp, third); } default: |
078faac9e ipc: add msgrcv s... |
70 |
return ksys_msgrcv(first, |
baed7fc9b Add generic sys_i... |
71 72 73 74 |
(struct msgbuf __user *) ptr, second, fifth, third); } case MSGGET: |
3d65661a4 ipc: add msgget s... |
75 |
return ksys_msgget((key_t) first, second); |
baed7fc9b Add generic sys_i... |
76 |
case MSGCTL: |
e340db564 ipc: add msgctl s... |
77 78 |
return ksys_msgctl(first, second, (struct msqid_ds __user *)ptr); |
baed7fc9b Add generic sys_i... |
79 80 81 82 83 84 |
case SHMAT: switch (version) { default: { unsigned long raddr; ret = do_shmat(first, (char __user *)ptr, |
079a96ae3 ipc: add COMPAT_S... |
85 |
second, &raddr, SHMLBA); |
baed7fc9b Add generic sys_i... |
86 87 88 89 90 91 92 93 94 95 96 97 |
if (ret) return ret; return put_user(raddr, (unsigned long __user *) third); } case 1: /* * This was the entry point for kernel-originating calls * from iBCS2 in 2.2 days. */ return -EINVAL; } case SHMDT: |
da1e27443 ipc: add shmdt sy... |
98 |
return ksys_shmdt((char __user *)ptr); |
baed7fc9b Add generic sys_i... |
99 |
case SHMGET: |
65749e0bb ipc: add shmget s... |
100 |
return ksys_shmget(first, second, third); |
baed7fc9b Add generic sys_i... |
101 |
case SHMCTL: |
c84d0791d ipc: add shmctl s... |
102 |
return ksys_shmctl(first, second, |
baed7fc9b Add generic sys_i... |
103 104 105 106 107 108 |
(struct shmid_ds __user *) ptr); default: return -ENOSYS; } } #endif |
20bc2a3af ipc(2): move comp... |
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
#ifdef CONFIG_COMPAT #include <linux/compat.h> #ifndef COMPAT_SHMLBA #define COMPAT_SHMLBA SHMLBA #endif struct compat_ipc_kludge { compat_uptr_t msgp; compat_long_t msgtyp; }; #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second, u32, third, compat_uptr_t, ptr, u32, fifth) { int version; u32 pad; version = call >> 16; /* hack for backward compatibility */ call &= 0xffff; switch (call) { case SEMOP: /* struct sembuf is the same on 32 and 64bit :)) */ |
41f4f0e2f ipc: add semtimed... |
135 |
return ksys_semtimedop(first, compat_ptr(ptr), second, NULL); |
20bc2a3af ipc(2): move comp... |
136 |
case SEMTIMEDOP: |
5dc0b1529 y2038: ipc: Redir... |
137 138 |
if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) return -ENOSYS; |
41f4f0e2f ipc: add semtimed... |
139 |
return compat_ksys_semtimedop(first, compat_ptr(ptr), second, |
20bc2a3af ipc(2): move comp... |
140 141 |
compat_ptr(fifth)); case SEMGET: |
69894718a ipc: add semget s... |
142 |
return ksys_semget(first, second, third); |
20bc2a3af ipc(2): move comp... |
143 144 145 146 147 |
case SEMCTL: if (!ptr) return -EINVAL; if (get_user(pad, (u32 __user *) compat_ptr(ptr))) return -EFAULT; |
d969c6fa7 ipc: add semctl s... |
148 |
return compat_ksys_semctl(first, second, third, pad); |
20bc2a3af ipc(2): move comp... |
149 150 |
case MSGSND: |
31c213f21 ipc: add msgsnd s... |
151 |
return compat_ksys_msgsnd(first, ptr, second, third); |
20bc2a3af ipc(2): move comp... |
152 153 154 155 156 157 158 159 160 161 162 163 164 |
case MSGRCV: { void __user *uptr = compat_ptr(ptr); if (first < 0 || second < 0) return -EINVAL; if (!version) { struct compat_ipc_kludge ipck; if (!uptr) return -EINVAL; if (copy_from_user(&ipck, uptr, sizeof(ipck))) return -EFAULT; |
078faac9e ipc: add msgrcv s... |
165 |
return compat_ksys_msgrcv(first, ipck.msgp, second, |
20bc2a3af ipc(2): move comp... |
166 167 |
ipck.msgtyp, third); } |
078faac9e ipc: add msgrcv s... |
168 |
return compat_ksys_msgrcv(first, ptr, second, fifth, third); |
20bc2a3af ipc(2): move comp... |
169 170 |
} case MSGGET: |
3d65661a4 ipc: add msgget s... |
171 |
return ksys_msgget(first, second); |
20bc2a3af ipc(2): move comp... |
172 |
case MSGCTL: |
e340db564 ipc: add msgctl s... |
173 |
return compat_ksys_msgctl(first, second, compat_ptr(ptr)); |
20bc2a3af ipc(2): move comp... |
174 175 176 177 178 179 180 181 182 183 184 |
case SHMAT: { int err; unsigned long raddr; if (version == 1) return -EINVAL; err = do_shmat(first, compat_ptr(ptr), second, &raddr, COMPAT_SHMLBA); if (err < 0) return err; |
6aa211e8c fix address space... |
185 |
return put_user(raddr, (compat_ulong_t __user *)compat_ptr(third)); |
20bc2a3af ipc(2): move comp... |
186 187 |
} case SHMDT: |
da1e27443 ipc: add shmdt sy... |
188 |
return ksys_shmdt(compat_ptr(ptr)); |
20bc2a3af ipc(2): move comp... |
189 |
case SHMGET: |
65749e0bb ipc: add shmget s... |
190 |
return ksys_shmget(first, (unsigned int)second, third); |
20bc2a3af ipc(2): move comp... |
191 |
case SHMCTL: |
c84d0791d ipc: add shmctl s... |
192 |
return compat_ksys_shmctl(first, second, compat_ptr(ptr)); |
20bc2a3af ipc(2): move comp... |
193 194 195 196 197 198 |
} return -ENOSYS; } #endif #endif |