diff options
Diffstat (limited to 'ipc/msg.c')
| -rw-r--r-- | ipc/msg.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/ipc/msg.c b/ipc/msg.c index 950572f9d79..fede1d06ef3 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -820,15 +820,17 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,  	struct msg_msg *copy = NULL;  	unsigned long copy_number = 0; +	ns = current->nsproxy->ipc_ns; +  	if (msqid < 0 || (long) bufsz < 0)  		return -EINVAL;  	if (msgflg & MSG_COPY) { -		copy = prepare_copy(buf, bufsz, msgflg, &msgtyp, ©_number); +		copy = prepare_copy(buf, min_t(size_t, bufsz, ns->msg_ctlmax), +				    msgflg, &msgtyp, ©_number);  		if (IS_ERR(copy))  			return PTR_ERR(copy);  	}  	mode = convert_mode(&msgtyp, msgflg); -	ns = current->nsproxy->ipc_ns;  	msq = msg_lock_check(ns, msqid);  	if (IS_ERR(msq)) { @@ -870,6 +872,7 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,  							goto out_unlock;  						break;  					} +					msg = ERR_PTR(-EAGAIN);  				} else  					break;  				msg_counter++;  |