diff options
author | Johannes Berg <johannes.berg@intel.com> | 2015-01-16 16:09:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-18 01:03:45 -0500 |
commit | 053c095a82cf773075e83d7233b5cc19a1f73ece (patch) | |
tree | c787028efa9a73a182a0f338f87b6294cef4b8b9 /net/core | |
parent | ede58ef28e105de94475b2b69fa069c9a2ce6933 (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/core')
-rw-r--r-- | net/core/fib_rules.c | 3 | ||||
-rw-r--r-- | net/core/neighbour.c | 12 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 9 |
3 files changed, 16 insertions, 8 deletions
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index 185c341fafbd..44706e81b2e0 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
@@ -609,7 +609,8 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule, | |||
609 | if (ops->fill(rule, skb, frh) < 0) | 609 | if (ops->fill(rule, skb, frh) < 0) |
610 | goto nla_put_failure; | 610 | goto nla_put_failure; |
611 | 611 | ||
612 | return nlmsg_end(skb, nlh); | 612 | nlmsg_end(skb, nlh); |
613 | return 0; | ||
613 | 614 | ||
614 | nla_put_failure: | 615 | nla_put_failure: |
615 | nlmsg_cancel(skb, nlh); | 616 | nlmsg_cancel(skb, nlh); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 8d614c93f86a..d36d564f149f 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1884,7 +1884,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, | |||
1884 | goto nla_put_failure; | 1884 | goto nla_put_failure; |
1885 | 1885 | ||
1886 | read_unlock_bh(&tbl->lock); | 1886 | read_unlock_bh(&tbl->lock); |
1887 | return nlmsg_end(skb, nlh); | 1887 | nlmsg_end(skb, nlh); |
1888 | return 0; | ||
1888 | 1889 | ||
1889 | nla_put_failure: | 1890 | nla_put_failure: |
1890 | read_unlock_bh(&tbl->lock); | 1891 | read_unlock_bh(&tbl->lock); |
@@ -1917,7 +1918,8 @@ static int neightbl_fill_param_info(struct sk_buff *skb, | |||
1917 | goto errout; | 1918 | goto errout; |
1918 | 1919 | ||
1919 | read_unlock_bh(&tbl->lock); | 1920 | read_unlock_bh(&tbl->lock); |
1920 | return nlmsg_end(skb, nlh); | 1921 | nlmsg_end(skb, nlh); |
1922 | return 0; | ||
1921 | errout: | 1923 | errout: |
1922 | read_unlock_bh(&tbl->lock); | 1924 | read_unlock_bh(&tbl->lock); |
1923 | nlmsg_cancel(skb, nlh); | 1925 | nlmsg_cancel(skb, nlh); |
@@ -2202,7 +2204,8 @@ static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh, | |||
2202 | nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci)) | 2204 | nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci)) |
2203 | goto nla_put_failure; | 2205 | goto nla_put_failure; |
2204 | 2206 | ||
2205 | return nlmsg_end(skb, nlh); | 2207 | nlmsg_end(skb, nlh); |
2208 | return 0; | ||
2206 | 2209 | ||
2207 | nla_put_failure: | 2210 | nla_put_failure: |
2208 | nlmsg_cancel(skb, nlh); | 2211 | nlmsg_cancel(skb, nlh); |
@@ -2232,7 +2235,8 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn, | |||
2232 | if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) | 2235 | if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) |
2233 | goto nla_put_failure; | 2236 | goto nla_put_failure; |
2234 | 2237 | ||
2235 | return nlmsg_end(skb, nlh); | 2238 | nlmsg_end(skb, nlh); |
2239 | return 0; | ||
2236 | 2240 | ||
2237 | nla_put_failure: | 2241 | nla_put_failure: |
2238 | nlmsg_cancel(skb, nlh); | 2242 | nlmsg_cancel(skb, nlh); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index eadc5c0e2dfa..e13b9dbdf154 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1199,7 +1199,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
1199 | 1199 | ||
1200 | nla_nest_end(skb, af_spec); | 1200 | nla_nest_end(skb, af_spec); |
1201 | 1201 | ||
1202 | return nlmsg_end(skb, nlh); | 1202 | nlmsg_end(skb, nlh); |
1203 | return 0; | ||
1203 | 1204 | ||
1204 | nla_put_failure: | 1205 | nla_put_failure: |
1205 | nlmsg_cancel(skb, nlh); | 1206 | nlmsg_cancel(skb, nlh); |
@@ -2326,7 +2327,8 @@ static int nlmsg_populate_fdb_fill(struct sk_buff *skb, | |||
2326 | if (nla_put(skb, NDA_LLADDR, ETH_ALEN, addr)) | 2327 | if (nla_put(skb, NDA_LLADDR, ETH_ALEN, addr)) |
2327 | goto nla_put_failure; | 2328 | goto nla_put_failure; |
2328 | 2329 | ||
2329 | return nlmsg_end(skb, nlh); | 2330 | nlmsg_end(skb, nlh); |
2331 | return 0; | ||
2330 | 2332 | ||
2331 | nla_put_failure: | 2333 | nla_put_failure: |
2332 | nlmsg_cancel(skb, nlh); | 2334 | nlmsg_cancel(skb, nlh); |
@@ -2809,7 +2811,8 @@ int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
2809 | 2811 | ||
2810 | nla_nest_end(skb, protinfo); | 2812 | nla_nest_end(skb, protinfo); |
2811 | 2813 | ||
2812 | return nlmsg_end(skb, nlh); | 2814 | nlmsg_end(skb, nlh); |
2815 | return 0; | ||
2813 | nla_put_failure: | 2816 | nla_put_failure: |
2814 | nlmsg_cancel(skb, nlh); | 2817 | nlmsg_cancel(skb, nlh); |
2815 | return -EMSGSIZE; | 2818 | return -EMSGSIZE; |