aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2007-03-23 02:28:46 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-26 01:27:29 -0400
commitd35b685640aeb39eb4f5e98c75e8e001e406f9a3 (patch)
treec3ec38a2fb54a3783dd9c764bf58be68557f9396 /net/netlink
parent33a0543cd9e090d2c6759e0ed85c3049c6efcc06 (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/netlink')
-rw-r--r--net/netlink/af_netlink.c10
-rw-r--r--net/netlink/genetlink.c3
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 }
1490skip:
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