|
@@ -1407,7 +1407,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
|
int noblock = flags&MSG_DONTWAIT;
|
|
int noblock = flags&MSG_DONTWAIT;
|
|
size_t copied;
|
|
size_t copied;
|
|
struct sk_buff *skb, *data_skb;
|
|
struct sk_buff *skb, *data_skb;
|
|
- int err;
|
|
|
|
|
|
+ int err, ret;
|
|
|
|
|
|
if (flags&MSG_OOB)
|
|
if (flags&MSG_OOB)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
@@ -1470,8 +1470,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
|
|
|
|
|
skb_free_datagram(sk, skb);
|
|
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);
|
|
scm_recv(sock, msg, siocb->scm, flags);
|
|
out:
|
|
out:
|
|
@@ -1736,6 +1741,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
|
|
struct netlink_callback *cb;
|
|
struct netlink_callback *cb;
|
|
struct sock *sk;
|
|
struct sock *sk;
|
|
struct netlink_sock *nlk;
|
|
struct netlink_sock *nlk;
|
|
|
|
+ int ret;
|
|
|
|
|
|
cb = kzalloc(sizeof(*cb), GFP_KERNEL);
|
|
cb = kzalloc(sizeof(*cb), GFP_KERNEL);
|
|
if (cb == NULL)
|
|
if (cb == NULL)
|
|
@@ -1764,9 +1770,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
|
|
nlk->cb = cb;
|
|
nlk->cb = cb;
|
|
mutex_unlock(nlk->cb_mutex);
|
|
mutex_unlock(nlk->cb_mutex);
|
|
|
|
|
|
- netlink_dump(sk);
|
|
|
|
|
|
+ ret = netlink_dump(sk);
|
|
|
|
+
|
|
sock_put(sk);
|
|
sock_put(sk);
|
|
|
|
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
/* We successfully started a dump, by returning -EINTR we
|
|
/* We successfully started a dump, by returning -EINTR we
|
|
* signal not to send ACK even if it was requested.
|
|
* signal not to send ACK even if it was requested.
|
|
*/
|
|
*/
|