diff options
Diffstat (limited to 'net/netlink')
-rw-r--r-- | net/netlink/af_netlink.c | 10 | ||||
-rw-r--r-- | net/netlink/genetlink.c | 3 |
2 files changed, 8 insertions, 5 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 8488c15f2643..7b455980e9bf 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1470,10 +1470,15 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, | |||
1470 | 1470 | ||
1471 | while (skb->len >= nlmsg_total_size(0)) { | 1471 | while (skb->len >= nlmsg_total_size(0)) { |
1472 | nlh = nlmsg_hdr(skb); | 1472 | nlh = nlmsg_hdr(skb); |
1473 | err = 0; | ||
1473 | 1474 | ||
1474 | if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) | 1475 | if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) |
1475 | return 0; | 1476 | return 0; |
1476 | 1477 | ||
1478 | /* Only requests are handled by the kernel */ | ||
1479 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) | ||
1480 | goto skip; | ||
1481 | |||
1477 | if (cb(skb, nlh, &err) < 0) { | 1482 | if (cb(skb, nlh, &err) < 0) { |
1478 | /* Not an error, but we have to interrupt processing | 1483 | /* Not an error, but we have to interrupt processing |
1479 | * here. Note: that in this case we do not pull | 1484 | * here. Note: that in this case we do not pull |
@@ -1481,9 +1486,10 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, | |||
1481 | */ | 1486 | */ |
1482 | if (err == 0) | 1487 | if (err == 0) |
1483 | return -1; | 1488 | return -1; |
1489 | } | ||
1490 | skip: | ||
1491 | if (nlh->nlmsg_flags & NLM_F_ACK || err) | ||
1484 | netlink_ack(skb, nlh, err); | 1492 | netlink_ack(skb, nlh, err); |
1485 | } else if (nlh->nlmsg_flags & NLM_F_ACK) | ||
1486 | netlink_ack(skb, nlh, 0); | ||
1487 | 1493 | ||
1488 | netlink_queue_skip(nlh, skb); | 1494 | netlink_queue_skip(nlh, skb); |
1489 | } | 1495 | } |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index c2996794eb25..039516f6cd80 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -304,9 +304,6 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
304 | struct genlmsghdr *hdr = nlmsg_data(nlh); | 304 | struct genlmsghdr *hdr = nlmsg_data(nlh); |
305 | int hdrlen, err = -EINVAL; | 305 | int hdrlen, err = -EINVAL; |
306 | 306 | ||
307 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) | ||
308 | goto ignore; | ||
309 | |||
310 | if (nlh->nlmsg_type < NLMSG_MIN_TYPE) | 307 | if (nlh->nlmsg_type < NLMSG_MIN_TYPE) |
311 | goto ignore; | 308 | goto ignore; |
312 | 309 | ||