diff options
Diffstat (limited to 'net/netlink')
-rw-r--r-- | net/netlink/af_netlink.c | 2 | ||||
-rw-r--r-- | net/netlink/attr.c | 19 | ||||
-rw-r--r-- | net/netlink/genetlink.c | 21 |
3 files changed, 21 insertions, 21 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9b97f8006c9c..349aba189558 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -886,7 +886,7 @@ retry: | |||
886 | return netlink_unicast_kernel(sk, skb); | 886 | return netlink_unicast_kernel(sk, skb); |
887 | 887 | ||
888 | if (sk_filter(sk, skb)) { | 888 | if (sk_filter(sk, skb)) { |
889 | int err = skb->len; | 889 | err = skb->len; |
890 | kfree_skb(skb); | 890 | kfree_skb(skb); |
891 | sock_put(sk); | 891 | sock_put(sk); |
892 | return err; | 892 | return err; |
diff --git a/net/netlink/attr.c b/net/netlink/attr.c index feb326f4a752..2d106cfe1d27 100644 --- a/net/netlink/attr.c +++ b/net/netlink/attr.c | |||
@@ -132,6 +132,7 @@ errout: | |||
132 | * @maxtype: maximum attribute type to be expected | 132 | * @maxtype: maximum attribute type to be expected |
133 | * @head: head of attribute stream | 133 | * @head: head of attribute stream |
134 | * @len: length of attribute stream | 134 | * @len: length of attribute stream |
135 | * @policy: validation policy | ||
135 | * | 136 | * |
136 | * Parses a stream of attributes and stores a pointer to each attribute in | 137 | * Parses a stream of attributes and stores a pointer to each attribute in |
137 | * the tb array accessable via the attribute type. Attributes with a type | 138 | * the tb array accessable via the attribute type. Attributes with a type |
@@ -194,7 +195,7 @@ struct nlattr *nla_find(struct nlattr *head, int len, int attrtype) | |||
194 | /** | 195 | /** |
195 | * nla_strlcpy - Copy string attribute payload into a sized buffer | 196 | * nla_strlcpy - Copy string attribute payload into a sized buffer |
196 | * @dst: where to copy the string to | 197 | * @dst: where to copy the string to |
197 | * @src: attribute to copy the string from | 198 | * @nla: attribute to copy the string from |
198 | * @dstsize: size of destination buffer | 199 | * @dstsize: size of destination buffer |
199 | * | 200 | * |
200 | * Copies at most dstsize - 1 bytes into the destination buffer. | 201 | * Copies at most dstsize - 1 bytes into the destination buffer. |
@@ -340,9 +341,9 @@ struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen) | |||
340 | } | 341 | } |
341 | 342 | ||
342 | /** | 343 | /** |
343 | * nla_reserve - reserve room for attribute without header | 344 | * nla_reserve_nohdr - reserve room for attribute without header |
344 | * @skb: socket buffer to reserve room on | 345 | * @skb: socket buffer to reserve room on |
345 | * @len: length of attribute payload | 346 | * @attrlen: length of attribute payload |
346 | * | 347 | * |
347 | * Reserves room for attribute payload without a header. | 348 | * Reserves room for attribute payload without a header. |
348 | * | 349 | * |
@@ -400,13 +401,13 @@ void __nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) | |||
400 | * @attrlen: length of attribute payload | 401 | * @attrlen: length of attribute payload |
401 | * @data: head of attribute payload | 402 | * @data: head of attribute payload |
402 | * | 403 | * |
403 | * Returns -1 if the tailroom of the skb is insufficient to store | 404 | * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store |
404 | * the attribute header and payload. | 405 | * the attribute header and payload. |
405 | */ | 406 | */ |
406 | int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data) | 407 | int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data) |
407 | { | 408 | { |
408 | if (unlikely(skb_tailroom(skb) < nla_total_size(attrlen))) | 409 | if (unlikely(skb_tailroom(skb) < nla_total_size(attrlen))) |
409 | return -1; | 410 | return -EMSGSIZE; |
410 | 411 | ||
411 | __nla_put(skb, attrtype, attrlen, data); | 412 | __nla_put(skb, attrtype, attrlen, data); |
412 | return 0; | 413 | return 0; |
@@ -418,13 +419,13 @@ int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data) | |||
418 | * @attrlen: length of attribute payload | 419 | * @attrlen: length of attribute payload |
419 | * @data: head of attribute payload | 420 | * @data: head of attribute payload |
420 | * | 421 | * |
421 | * Returns -1 if the tailroom of the skb is insufficient to store | 422 | * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store |
422 | * the attribute payload. | 423 | * the attribute payload. |
423 | */ | 424 | */ |
424 | int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) | 425 | int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) |
425 | { | 426 | { |
426 | if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) | 427 | if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) |
427 | return -1; | 428 | return -EMSGSIZE; |
428 | 429 | ||
429 | __nla_put_nohdr(skb, attrlen, data); | 430 | __nla_put_nohdr(skb, attrlen, data); |
430 | return 0; | 431 | return 0; |
@@ -436,13 +437,13 @@ int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) | |||
436 | * @attrlen: length of attribute payload | 437 | * @attrlen: length of attribute payload |
437 | * @data: head of attribute payload | 438 | * @data: head of attribute payload |
438 | * | 439 | * |
439 | * Returns -1 if the tailroom of the skb is insufficient to store | 440 | * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store |
440 | * the attribute payload. | 441 | * the attribute payload. |
441 | */ | 442 | */ |
442 | int nla_append(struct sk_buff *skb, int attrlen, const void *data) | 443 | int nla_append(struct sk_buff *skb, int attrlen, const void *data) |
443 | { | 444 | { |
444 | if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) | 445 | if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) |
445 | return -1; | 446 | return -EMSGSIZE; |
446 | 447 | ||
447 | memcpy(skb_put(skb, attrlen), data, attrlen); | 448 | memcpy(skb_put(skb, attrlen), data, attrlen); |
448 | return 0; | 449 | return 0; |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index d16929c9b4bc..3e1191cecaf0 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -444,8 +444,11 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
444 | if (ops->dumpit == NULL) | 444 | if (ops->dumpit == NULL) |
445 | return -EOPNOTSUPP; | 445 | return -EOPNOTSUPP; |
446 | 446 | ||
447 | return netlink_dump_start(genl_sock, skb, nlh, | 447 | genl_unlock(); |
448 | ops->dumpit, ops->done); | 448 | err = netlink_dump_start(genl_sock, skb, nlh, |
449 | ops->dumpit, ops->done); | ||
450 | genl_lock(); | ||
451 | return err; | ||
449 | } | 452 | } |
450 | 453 | ||
451 | if (ops->doit == NULL) | 454 | if (ops->doit == NULL) |
@@ -554,7 +557,8 @@ static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq, | |||
554 | return genlmsg_end(skb, hdr); | 557 | return genlmsg_end(skb, hdr); |
555 | 558 | ||
556 | nla_put_failure: | 559 | nla_put_failure: |
557 | return genlmsg_cancel(skb, hdr); | 560 | genlmsg_cancel(skb, hdr); |
561 | return -EMSGSIZE; | ||
558 | } | 562 | } |
559 | 563 | ||
560 | static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 pid, | 564 | static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 pid, |
@@ -590,7 +594,8 @@ static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 pid, | |||
590 | return genlmsg_end(skb, hdr); | 594 | return genlmsg_end(skb, hdr); |
591 | 595 | ||
592 | nla_put_failure: | 596 | nla_put_failure: |
593 | return genlmsg_cancel(skb, hdr); | 597 | genlmsg_cancel(skb, hdr); |
598 | return -EMSGSIZE; | ||
594 | } | 599 | } |
595 | 600 | ||
596 | static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | 601 | static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) |
@@ -601,9 +606,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | |||
601 | int chains_to_skip = cb->args[0]; | 606 | int chains_to_skip = cb->args[0]; |
602 | int fams_to_skip = cb->args[1]; | 607 | int fams_to_skip = cb->args[1]; |
603 | 608 | ||
604 | if (chains_to_skip != 0) | ||
605 | genl_lock(); | ||
606 | |||
607 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 609 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
608 | if (i < chains_to_skip) | 610 | if (i < chains_to_skip) |
609 | continue; | 611 | continue; |
@@ -621,9 +623,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | |||
621 | } | 623 | } |
622 | 624 | ||
623 | errout: | 625 | errout: |
624 | if (chains_to_skip != 0) | ||
625 | genl_unlock(); | ||
626 | |||
627 | cb->args[0] = i; | 626 | cb->args[0] = i; |
628 | cb->args[1] = n; | 627 | cb->args[1] = n; |
629 | 628 | ||
@@ -768,7 +767,7 @@ static int __init genl_init(void) | |||
768 | 767 | ||
769 | /* we'll bump the group number right afterwards */ | 768 | /* we'll bump the group number right afterwards */ |
770 | genl_sock = netlink_kernel_create(&init_net, NETLINK_GENERIC, 0, | 769 | genl_sock = netlink_kernel_create(&init_net, NETLINK_GENERIC, 0, |
771 | genl_rcv, NULL, THIS_MODULE); | 770 | genl_rcv, &genl_mutex, THIS_MODULE); |
772 | if (genl_sock == NULL) | 771 | if (genl_sock == NULL) |
773 | panic("GENL: Cannot initialize generic netlink\n"); | 772 | panic("GENL: Cannot initialize generic netlink\n"); |
774 | 773 | ||