diff options
-rw-r--r-- | net/netlink/af_netlink.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 98e313e5e594..325272925d0f 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1565,7 +1565,11 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, | |||
1565 | 1565 | ||
1566 | netlink_dump(sk); | 1566 | netlink_dump(sk); |
1567 | sock_put(sk); | 1567 | sock_put(sk); |
1568 | return 0; | 1568 | |
1569 | /* We successfully started a dump, by returning -EINTR we | ||
1570 | * signal not to send ACK even if it was requested. | ||
1571 | */ | ||
1572 | return -EINTR; | ||
1569 | } | 1573 | } |
1570 | 1574 | ||
1571 | void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err) | 1575 | void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err) |
@@ -1619,17 +1623,21 @@ int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, | |||
1619 | 1623 | ||
1620 | /* Only requests are handled by the kernel */ | 1624 | /* Only requests are handled by the kernel */ |
1621 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) | 1625 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) |
1622 | goto skip; | 1626 | goto ack; |
1623 | 1627 | ||
1624 | /* Skip control messages */ | 1628 | /* Skip control messages */ |
1625 | if (nlh->nlmsg_type < NLMSG_MIN_TYPE) | 1629 | if (nlh->nlmsg_type < NLMSG_MIN_TYPE) |
1626 | goto skip; | 1630 | goto ack; |
1627 | 1631 | ||
1628 | err = cb(skb, nlh); | 1632 | err = cb(skb, nlh); |
1629 | skip: | 1633 | if (err == -EINTR) |
1634 | goto skip; | ||
1635 | |||
1636 | ack: | ||
1630 | if (nlh->nlmsg_flags & NLM_F_ACK || err) | 1637 | if (nlh->nlmsg_flags & NLM_F_ACK || err) |
1631 | netlink_ack(skb, nlh, err); | 1638 | netlink_ack(skb, nlh, err); |
1632 | 1639 | ||
1640 | skip: | ||
1633 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); | 1641 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); |
1634 | if (msglen > skb->len) | 1642 | if (msglen > skb->len) |
1635 | msglen = skb->len; | 1643 | msglen = skb->len; |