msgrcv(2), msgsnd(2): move compat to native
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 9 Jul 2017 14:34:35 +0000 (10:34 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 16 Jul 2017 00:46:46 +0000 (20:46 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/linux/msg.h
ipc/compat.c
ipc/msg.c

index f3f302f9c1975a67ea1c01a828403950fac8a061..4e5ec3cbf4640c35a4f0bb88b1a1b59ac2192400 100644 (file)
@@ -31,12 +31,4 @@ struct msg_queue {
        struct list_head q_senders;
 };
 
-/* Helper routines for sys_msgsnd and sys_msgrcv */
-extern long do_msgsnd(int msqid, long mtype, void __user *mtext,
-                       size_t msgsz, int msgflg);
-extern long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
-                     int msgflg,
-                     long (*msg_fill)(void __user *, struct msg_msg *,
-                                      size_t));
-
 #endif /* _LINUX_MSG_H */
index 00c2e3beccc881996f44e298431f9ab7e74777fa..0586687c3e3196628b01f3aa1d54e2b12445d5df 100644 (file)
 
 #include "util.h"
 
-struct compat_msgbuf {
-       compat_long_t mtype;
-       char mtext[1];
-};
-
 int get_compat_ipc64_perm(struct ipc64_perm *to,
                          struct compat_ipc64_perm __user *from)
 {
@@ -85,38 +80,6 @@ void to_compat_ipc_perm(struct compat_ipc_perm *to, struct ipc64_perm *from)
        to->seq = from->seq;
 }
 
-static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
-{
-       struct compat_msgbuf __user *msgp = dest;
-       size_t msgsz;
-
-       if (put_user(msg->m_type, &msgp->mtype))
-               return -EFAULT;
-
-       msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
-       if (store_msg(msgp->mtext, msg, msgsz))
-               return -EFAULT;
-       return msgsz;
-}
-
-COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
-                      compat_ssize_t, msgsz, int, msgflg)
-{
-       struct compat_msgbuf __user *up = compat_ptr(msgp);
-       compat_long_t mtype;
-
-       if (get_user(mtype, &up->mtype))
-               return -EFAULT;
-       return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
-}
-
-COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
-                      compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg)
-{
-       return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,
-                        msgflg, compat_do_msg_fill);
-}
-
 #ifndef COMPAT_SHMLBA
 #define COMPAT_SHMLBA  SHMLBA
 #endif
index 94690fb53f6641b79f6cb8434096d4cd65e1d1bf..855da19c765ad46de87944c17550dd64d622a146 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -730,7 +730,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
        return 0;
 }
 
-long do_msgsnd(int msqid, long mtype, void __user *mtext,
+static long do_msgsnd(int msqid, long mtype, void __user *mtext,
                size_t msgsz, int msgflg)
 {
        struct msg_queue *msq;
@@ -853,6 +853,25 @@ SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
        return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
 }
 
+#ifdef CONFIG_COMPAT
+
+struct compat_msgbuf {
+       compat_long_t mtype;
+       char mtext[1];
+};
+
+COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
+                      compat_ssize_t, msgsz, int, msgflg)
+{
+       struct compat_msgbuf __user *up = compat_ptr(msgp);
+       compat_long_t mtype;
+
+       if (get_user(mtype, &up->mtype))
+               return -EFAULT;
+       return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
+}
+#endif
+
 static inline int convert_mode(long *msgtyp, int msgflg)
 {
        if (msgflg & MSG_COPY)
@@ -949,7 +968,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
        return found ?: ERR_PTR(-EAGAIN);
 }
 
-long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
+static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
               long (*msg_handler)(void __user *, struct msg_msg *, size_t))
 {
        int mode;
@@ -1113,6 +1132,28 @@ SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
        return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill);
 }
 
+#ifdef CONFIG_COMPAT
+static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
+{
+       struct compat_msgbuf __user *msgp = dest;
+       size_t msgsz;
+
+       if (put_user(msg->m_type, &msgp->mtype))
+               return -EFAULT;
+
+       msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
+       if (store_msg(msgp->mtext, msg, msgsz))
+               return -EFAULT;
+       return msgsz;
+}
+
+COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
+                      compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg)
+{
+       return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,
+                        msgflg, compat_do_msg_fill);
+}
+#endif
 
 void msg_init_ns(struct ipc_namespace *ns)
 {