diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 19 | 
1 files changed, 4 insertions, 15 deletions
| diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index aad8fb699989..85d3bb7490aa 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1918,7 +1918,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		struct sk_buff *skb;  		unix_state_lock(sk); -		skb = skb_dequeue(&sk->sk_receive_queue); +		skb = skb_peek(&sk->sk_receive_queue);  		if (skb == NULL) {  			unix_sk(sk)->recursion_level = 0;  			if (copied >= target) @@ -1958,11 +1958,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		if (check_creds) {  			/* Never glue messages from different writers */  			if ((UNIXCB(skb).pid  != siocb->scm->pid) || -			    (UNIXCB(skb).cred != siocb->scm->cred)) { -				skb_queue_head(&sk->sk_receive_queue, skb); -				sk->sk_data_ready(sk, skb->len); +			    (UNIXCB(skb).cred != siocb->scm->cred))  				break; -			}  		} else {  			/* Copy credentials */  			scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred); @@ -1977,8 +1974,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		chunk = min_t(unsigned int, skb->len, size);  		if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { -			skb_queue_head(&sk->sk_receive_queue, skb); -			sk->sk_data_ready(sk, skb->len);  			if (copied == 0)  				copied = -EFAULT;  			break; @@ -1993,13 +1988,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			if (UNIXCB(skb).fp)  				unix_detach_fds(siocb->scm, skb); -			/* put the skb back if we didn't use it up.. */ -			if (skb->len) { -				skb_queue_head(&sk->sk_receive_queue, skb); -				sk->sk_data_ready(sk, skb->len); +			if (skb->len)  				break; -			} +			skb_unlink(skb, &sk->sk_receive_queue);  			consume_skb(skb);  			if (siocb->scm->fp) @@ -2010,9 +2002,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			if (UNIXCB(skb).fp)  				siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp); -			/* put message back and return */ -			skb_queue_head(&sk->sk_receive_queue, skb); -			sk->sk_data_ready(sk, skb->len);  			break;  		}  	} while (size); | 
