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; |
