diff options
Diffstat (limited to 'net/netlink/af_netlink.c')
| -rw-r--r-- | net/netlink/af_netlink.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 478181d53c5..1f924595bde 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1407,7 +1407,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,  	int noblock = flags&MSG_DONTWAIT;  	size_t copied;  	struct sk_buff *skb, *data_skb; -	int err; +	int err, ret;  	if (flags&MSG_OOB)  		return -EOPNOTSUPP; @@ -1470,8 +1470,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,  	skb_free_datagram(sk, skb); -	if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) -		netlink_dump(sk); +	if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { +		ret = netlink_dump(sk); +		if (ret) { +			sk->sk_err = ret; +			sk->sk_error_report(sk); +		} +	}  	scm_recv(sock, msg, siocb->scm, flags);  out: @@ -1736,6 +1741,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,  	struct netlink_callback *cb;  	struct sock *sk;  	struct netlink_sock *nlk; +	int ret;  	cb = kzalloc(sizeof(*cb), GFP_KERNEL);  	if (cb == NULL) @@ -1764,9 +1770,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,  	nlk->cb = cb;  	mutex_unlock(nlk->cb_mutex); -	netlink_dump(sk); +	ret = netlink_dump(sk); +  	sock_put(sk); +	if (ret) +		return ret; +  	/* We successfully started a dump, by returning -EINTR we  	 * signal not to send ACK even if it was requested.  	 */  |