|
@@ -626,12 +626,11 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-asmlinkage long
|
|
|
-sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
|
|
|
+long do_msgsnd(int msqid, long mtype, void __user *mtext,
|
|
|
+ size_t msgsz, int msgflg)
|
|
|
{
|
|
|
struct msg_queue *msq;
|
|
|
struct msg_msg *msg;
|
|
|
- long mtype;
|
|
|
int err;
|
|
|
struct ipc_namespace *ns;
|
|
|
|
|
@@ -639,12 +638,10 @@ sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
|
|
|
|
|
|
if (msgsz > ns->msg_ctlmax || (long) msgsz < 0 || msqid < 0)
|
|
|
return -EINVAL;
|
|
|
- if (get_user(mtype, &msgp->mtype))
|
|
|
- return -EFAULT;
|
|
|
if (mtype < 1)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- msg = load_msg(msgp->mtext, msgsz);
|
|
|
+ msg = load_msg(mtext, msgsz);
|
|
|
if (IS_ERR(msg))
|
|
|
return PTR_ERR(msg);
|
|
|
|
|
@@ -723,6 +720,16 @@ out_free:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+asmlinkage long
|
|
|
+sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
|
|
|
+{
|
|
|
+ long mtype;
|
|
|
+
|
|
|
+ if (get_user(mtype, &msgp->mtype))
|
|
|
+ return -EFAULT;
|
|
|
+ return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
|
|
|
+}
|
|
|
+
|
|
|
static inline int convert_mode(long *msgtyp, int msgflg)
|
|
|
{
|
|
|
/*
|
|
@@ -742,8 +749,8 @@ static inline int convert_mode(long *msgtyp, int msgflg)
|
|
|
return SEARCH_EQUAL;
|
|
|
}
|
|
|
|
|
|
-asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
|
|
- long msgtyp, int msgflg)
|
|
|
+long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
|
|
|
+ size_t msgsz, long msgtyp, int msgflg)
|
|
|
{
|
|
|
struct msg_queue *msq;
|
|
|
struct msg_msg *msg;
|
|
@@ -889,15 +896,30 @@ out_unlock:
|
|
|
return PTR_ERR(msg);
|
|
|
|
|
|
msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz;
|
|
|
- if (put_user (msg->m_type, &msgp->mtype) ||
|
|
|
- store_msg(msgp->mtext, msg, msgsz)) {
|
|
|
+ *pmtype = msg->m_type;
|
|
|
+ if (store_msg(mtext, msg, msgsz))
|
|
|
msgsz = -EFAULT;
|
|
|
- }
|
|
|
+
|
|
|
free_msg(msg);
|
|
|
|
|
|
return msgsz;
|
|
|
}
|
|
|
|
|
|
+asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
|
|
|
+ long msgtyp, int msgflg)
|
|
|
+{
|
|
|
+ long err, mtype;
|
|
|
+
|
|
|
+ err = do_msgrcv(msqid, &mtype, msgp->mtext, msgsz, msgtyp, msgflg);
|
|
|
+ if (err < 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ if (put_user(mtype, &msgp->mtype))
|
|
|
+ err = -EFAULT;
|
|
|
+out:
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_PROC_FS
|
|
|
static int sysvipc_msg_proc_show(struct seq_file *s, void *it)
|
|
|
{
|