summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2018-03-20 16:29:00 -0400
committerDominik Brodowski <linux@dominikbrodowski.net>2018-04-02 14:15:28 -0400
commit31c213f2106b7ea06f7fdc94ef8b785ed5342cf7 (patch)
tree2d35678c97d438ac743f30b596006370a1e02c15
parent078faac9e8b6c8124bc012bbf97cca59caf6d4ea (diff)
ipc: add msgsnd syscall/compat_syscall wrappers
Provide ksys_msgsnd() and compat_ksys_msgsnd() wrappers to avoid in-kernel calls to these syscalls. The ksys_ prefix denotes that these functions are meant as a drop-in replacement for the syscalls. In particular, they use the same calling convention as sys_msgsnd() and compat_sys_msgsnd(). This patch is part of a series which removes in-kernel calls to syscalls. On this basis, the syscall entry path can be streamlined. For details, see http://lkml.kernel.org/r/20180325162527.GA17492@light.dominikbrodowski.net Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
-rw-r--r--ipc/msg.c20
-rw-r--r--ipc/syscall.c4
-rw-r--r--ipc/util.h4
3 files changed, 22 insertions, 6 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index abc5826270a6..9de48065c1ac 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -867,8 +867,8 @@ out_unlock1:
867 return err; 867 return err;
868} 868}
869 869
870SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz, 870long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
871 int, msgflg) 871 int msgflg)
872{ 872{
873 long mtype; 873 long mtype;
874 874
@@ -877,6 +877,12 @@ SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
877 return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg); 877 return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
878} 878}
879 879
880SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
881 int, msgflg)
882{
883 return ksys_msgsnd(msqid, msgp, msgsz, msgflg);
884}
885
880#ifdef CONFIG_COMPAT 886#ifdef CONFIG_COMPAT
881 887
882struct compat_msgbuf { 888struct compat_msgbuf {
@@ -884,8 +890,8 @@ struct compat_msgbuf {
884 char mtext[1]; 890 char mtext[1];
885}; 891};
886 892
887COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp, 893long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
888 compat_ssize_t, msgsz, int, msgflg) 894 compat_ssize_t msgsz, int msgflg)
889{ 895{
890 struct compat_msgbuf __user *up = compat_ptr(msgp); 896 struct compat_msgbuf __user *up = compat_ptr(msgp);
891 compat_long_t mtype; 897 compat_long_t mtype;
@@ -894,6 +900,12 @@ COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
894 return -EFAULT; 900 return -EFAULT;
895 return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg); 901 return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
896} 902}
903
904COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
905 compat_ssize_t, msgsz, int, msgflg)
906{
907 return compat_ksys_msgsnd(msqid, msgp, msgsz, msgflg);
908}
897#endif 909#endif
898 910
899static inline int convert_mode(long *msgtyp, int msgflg) 911static inline int convert_mode(long *msgtyp, int msgflg)
diff --git a/ipc/syscall.c b/ipc/syscall.c
index 0228c7afd882..77a883ef2eca 100644
--- a/ipc/syscall.c
+++ b/ipc/syscall.c
@@ -46,7 +46,7 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
46 } 46 }
47 47
48 case MSGSND: 48 case MSGSND:
49 return sys_msgsnd(first, (struct msgbuf __user *) ptr, 49 return ksys_msgsnd(first, (struct msgbuf __user *) ptr,
50 second, third); 50 second, third);
51 case MSGRCV: 51 case MSGRCV:
52 switch (version) { 52 switch (version) {
@@ -142,7 +142,7 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
142 return compat_ksys_semctl(first, second, third, pad); 142 return compat_ksys_semctl(first, second, third, pad);
143 143
144 case MSGSND: 144 case MSGSND:
145 return compat_sys_msgsnd(first, ptr, second, third); 145 return compat_ksys_msgsnd(first, ptr, second, third);
146 146
147 case MSGRCV: { 147 case MSGRCV: {
148 void __user *uptr = compat_ptr(ptr); 148 void __user *uptr = compat_ptr(ptr);
diff --git a/ipc/util.h b/ipc/util.h
index c16aceb1bdec..51853dc2f340 100644
--- a/ipc/util.h
+++ b/ipc/util.h
@@ -246,6 +246,8 @@ long ksys_msgget(key_t key, int msgflg);
246long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf); 246long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
247long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz, 247long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
248 long msgtyp, int msgflg); 248 long msgtyp, int msgflg);
249long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
250 int msgflg);
249long ksys_shmget(key_t key, size_t size, int shmflg); 251long ksys_shmget(key_t key, size_t size, int shmflg);
250long ksys_shmdt(char __user *shmaddr); 252long ksys_shmdt(char __user *shmaddr);
251long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); 253long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
@@ -259,6 +261,8 @@ long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
259long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr); 261long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
260long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz, 262long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
261 compat_long_t msgtyp, int msgflg); 263 compat_long_t msgtyp, int msgflg);
264long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
265 compat_ssize_t msgsz, int msgflg);
262long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr); 266long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr);
263#endif /* CONFIG_COMPAT */ 267#endif /* CONFIG_COMPAT */
264 268