aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2015-01-16 16:09:00 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-18 01:03:45 -0500
commit053c095a82cf773075e83d7233b5cc19a1f73ece (patch)
treec787028efa9a73a182a0f338f87b6294cef4b8b9 /net/wireless
parentede58ef28e105de94475b2b69fa069c9a2ce6933 (diff)
netlink: make nlmsg_end() and genlmsg_end() void
Contrary to common expectations for an "int" return, these functions return only a positive value -- if used correctly they cannot even return 0 because the message header will necessarily be in the skb. This makes the very common pattern of if (genlmsg_end(...) < 0) { ... } be a whole bunch of dead code. Many places also simply do return nlmsg_end(...); and the caller is expected to deal with it. This also commonly (at least for me) causes errors, because it is very common to write if (my_function(...)) /* error condition */ and if my_function() does "return nlmsg_end()" this is of course wrong. Additionally, there's not a single place in the kernel that actually needs the message length returned, and if anyone needs it later then it'll be very easy to just use skb->len there. Remove this, and make the functions void. This removes a bunch of dead code as described above. The patch adds lines because I did - return nlmsg_end(...); + nlmsg_end(...); + return 0; I could have preserved all the function's return values by returning skb->len, but instead I've audited all the places calling the affected functions and found that none cared. A few places actually compared the return value with <= 0 in dump functionality, but that could just be changed to < 0 with no change in behaviour, so I opted for the more efficient version. One instance of the error I've made numerous times now is also present in net/phonet/pn_netlink.c in the route_dumpit() function - it didn't check for <0 or <=0 and thus broke out of the loop every single time. I've preserved this since it will (I think) have caused the messages to userspace to be formatted differently with just a single message for every SKB returned to userspace. It's possible that this isn't needed for the tools that actually use this, but I don't even know what they are so couldn't test that changing this behaviour would be acceptable. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 380784378df8..4ed9039bd5f9 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1721,7 +1721,8 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
1721 break; 1721 break;
1722 } 1722 }
1723 finish: 1723 finish:
1724 return genlmsg_end(msg, hdr); 1724 genlmsg_end(msg, hdr);
1725 return 0;
1725 1726
1726 nla_put_failure: 1727 nla_put_failure:
1727 genlmsg_cancel(msg, hdr); 1728 genlmsg_cancel(msg, hdr);
@@ -2404,7 +2405,8 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag
2404 goto nla_put_failure; 2405 goto nla_put_failure;
2405 } 2406 }
2406 2407
2407 return genlmsg_end(msg, hdr); 2408 genlmsg_end(msg, hdr);
2409 return 0;
2408 2410
2409 nla_put_failure: 2411 nla_put_failure:
2410 genlmsg_cancel(msg, hdr); 2412 genlmsg_cancel(msg, hdr);
@@ -3825,7 +3827,8 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
3825 sinfo->assoc_req_ies)) 3827 sinfo->assoc_req_ies))
3826 goto nla_put_failure; 3828 goto nla_put_failure;
3827 3829
3828 return genlmsg_end(msg, hdr); 3830 genlmsg_end(msg, hdr);
3831 return 0;
3829 3832
3830 nla_put_failure: 3833 nla_put_failure:
3831 genlmsg_cancel(msg, hdr); 3834 genlmsg_cancel(msg, hdr);
@@ -4555,7 +4558,8 @@ static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
4555 4558
4556 nla_nest_end(msg, pinfoattr); 4559 nla_nest_end(msg, pinfoattr);
4557 4560
4558 return genlmsg_end(msg, hdr); 4561 genlmsg_end(msg, hdr);
4562 return 0;
4559 4563
4560 nla_put_failure: 4564 nla_put_failure:
4561 genlmsg_cancel(msg, hdr); 4565 genlmsg_cancel(msg, hdr);
@@ -5507,7 +5511,8 @@ static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
5507 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 5511 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
5508 goto nla_put_failure; 5512 goto nla_put_failure;
5509 5513
5510 return genlmsg_end(msg, hdr); 5514 genlmsg_end(msg, hdr);
5515 return 0;
5511 5516
5512nla_put_failure: 5517nla_put_failure:
5513 genlmsg_cancel(msg, hdr); 5518 genlmsg_cancel(msg, hdr);
@@ -6577,7 +6582,8 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
6577 6582
6578 nla_nest_end(msg, bss); 6583 nla_nest_end(msg, bss);
6579 6584
6580 return genlmsg_end(msg, hdr); 6585 genlmsg_end(msg, hdr);
6586 return 0;
6581 6587
6582 fail_unlock_rcu: 6588 fail_unlock_rcu:
6583 rcu_read_unlock(); 6589 rcu_read_unlock();
@@ -6686,7 +6692,8 @@ static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
6686 6692
6687 nla_nest_end(msg, infoattr); 6693 nla_nest_end(msg, infoattr);
6688 6694
6689 return genlmsg_end(msg, hdr); 6695 genlmsg_end(msg, hdr);
6696 return 0;
6690 6697
6691 nla_put_failure: 6698 nla_put_failure:
6692 genlmsg_cancel(msg, hdr); 6699 genlmsg_cancel(msg, hdr);
@@ -11025,7 +11032,8 @@ static int nl80211_send_scan_msg(struct sk_buff *msg,
11025 /* ignore errors and send incomplete event anyway */ 11032 /* ignore errors and send incomplete event anyway */
11026 nl80211_add_scan_req(msg, rdev); 11033 nl80211_add_scan_req(msg, rdev);
11027 11034
11028 return genlmsg_end(msg, hdr); 11035 genlmsg_end(msg, hdr);
11036 return 0;
11029 11037
11030 nla_put_failure: 11038 nla_put_failure:
11031 genlmsg_cancel(msg, hdr); 11039 genlmsg_cancel(msg, hdr);
@@ -11048,7 +11056,8 @@ nl80211_send_sched_scan_msg(struct sk_buff *msg,
11048 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 11056 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11049 goto nla_put_failure; 11057 goto nla_put_failure;
11050 11058
11051 return genlmsg_end(msg, hdr); 11059 genlmsg_end(msg, hdr);
11060 return 0;
11052 11061
11053 nla_put_failure: 11062 nla_put_failure:
11054 genlmsg_cancel(msg, hdr); 11063 genlmsg_cancel(msg, hdr);