diff options
author | Thomas Graf <tgraf@suug.ch> | 2007-03-23 02:28:46 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:27:29 -0400 |
commit | d35b685640aeb39eb4f5e98c75e8e001e406f9a3 (patch) | |
tree | c3ec38a2fb54a3783dd9c764bf58be68557f9396 /net | |
parent | 33a0543cd9e090d2c6759e0ed85c3049c6efcc06 (diff) |
[NETLINK]: Ignore !NLM_F_REQUEST messages directly in netlink_run_queue()
netlink_rcv_skb() is changed to skip messages which don't have the
NLM_F_REQUEST bit to avoid every netlink family having to perform this
check on their own.
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/rtnetlink.c | 4 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 10 | ||||
-rw-r--r-- | net/netlink/genetlink.c | 3 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 3 |
4 files changed, 8 insertions, 12 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4398cb81bcab..cc09283fd76a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -862,10 +862,6 @@ rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *errp) | |||
862 | int type; | 862 | int type; |
863 | int err; | 863 | int err; |
864 | 864 | ||
865 | /* Only requests are handled by kernel now */ | ||
866 | if (!(nlh->nlmsg_flags&NLM_F_REQUEST)) | ||
867 | return 0; | ||
868 | |||
869 | type = nlh->nlmsg_type; | 865 | type = nlh->nlmsg_type; |
870 | 866 | ||
871 | /* A control message: ignore them */ | 867 | /* A control message: ignore them */ |
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 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 6b7f6dc144c7..913c8b727d8f 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -1858,9 +1858,6 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *err | |||
1858 | struct xfrm_link *link; | 1858 | struct xfrm_link *link; |
1859 | int type, min_len; | 1859 | int type, min_len; |
1860 | 1860 | ||
1861 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) | ||
1862 | return 0; | ||
1863 | |||
1864 | type = nlh->nlmsg_type; | 1861 | type = nlh->nlmsg_type; |
1865 | 1862 | ||
1866 | /* A control message: ignore them */ | 1863 | /* A control message: ignore them */ |