aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
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/ipv6
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/ipv6')
-rw-r--r--net/ipv6/addrconf.c32
-rw-r--r--net/ipv6/addrlabel.c5
-rw-r--r--net/ipv6/ip6_fib.c1
-rw-r--r--net/ipv6/ip6mr.c3
-rw-r--r--net/ipv6/route.c3
5 files changed, 26 insertions, 18 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index f7c8bbeb27b7..8975d9501d50 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -489,7 +489,8 @@ static int inet6_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
489 nla_put_s32(skb, NETCONFA_PROXY_NEIGH, devconf->proxy_ndp) < 0) 489 nla_put_s32(skb, NETCONFA_PROXY_NEIGH, devconf->proxy_ndp) < 0)
490 goto nla_put_failure; 490 goto nla_put_failure;
491 491
492 return nlmsg_end(skb, nlh); 492 nlmsg_end(skb, nlh);
493 return 0;
493 494
494nla_put_failure: 495nla_put_failure:
495 nlmsg_cancel(skb, nlh); 496 nlmsg_cancel(skb, nlh);
@@ -619,7 +620,7 @@ static int inet6_netconf_dump_devconf(struct sk_buff *skb,
619 cb->nlh->nlmsg_seq, 620 cb->nlh->nlmsg_seq,
620 RTM_NEWNETCONF, 621 RTM_NEWNETCONF,
621 NLM_F_MULTI, 622 NLM_F_MULTI,
622 -1) <= 0) { 623 -1) < 0) {
623 rcu_read_unlock(); 624 rcu_read_unlock();
624 goto done; 625 goto done;
625 } 626 }
@@ -635,7 +636,7 @@ cont:
635 NETLINK_CB(cb->skb).portid, 636 NETLINK_CB(cb->skb).portid,
636 cb->nlh->nlmsg_seq, 637 cb->nlh->nlmsg_seq,
637 RTM_NEWNETCONF, NLM_F_MULTI, 638 RTM_NEWNETCONF, NLM_F_MULTI,
638 -1) <= 0) 639 -1) < 0)
639 goto done; 640 goto done;
640 else 641 else
641 h++; 642 h++;
@@ -646,7 +647,7 @@ cont:
646 NETLINK_CB(cb->skb).portid, 647 NETLINK_CB(cb->skb).portid,
647 cb->nlh->nlmsg_seq, 648 cb->nlh->nlmsg_seq,
648 RTM_NEWNETCONF, NLM_F_MULTI, 649 RTM_NEWNETCONF, NLM_F_MULTI,
649 -1) <= 0) 650 -1) < 0)
650 goto done; 651 goto done;
651 else 652 else
652 h++; 653 h++;
@@ -4047,7 +4048,8 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
4047 if (nla_put_u32(skb, IFA_FLAGS, ifa->flags) < 0) 4048 if (nla_put_u32(skb, IFA_FLAGS, ifa->flags) < 0)
4048 goto error; 4049 goto error;
4049 4050
4050 return nlmsg_end(skb, nlh); 4051 nlmsg_end(skb, nlh);
4052 return 0;
4051 4053
4052error: 4054error:
4053 nlmsg_cancel(skb, nlh); 4055 nlmsg_cancel(skb, nlh);
@@ -4076,7 +4078,8 @@ static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
4076 return -EMSGSIZE; 4078 return -EMSGSIZE;
4077 } 4079 }
4078 4080
4079 return nlmsg_end(skb, nlh); 4081 nlmsg_end(skb, nlh);
4082 return 0;
4080} 4083}
4081 4084
4082static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca, 4085static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
@@ -4101,7 +4104,8 @@ static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
4101 return -EMSGSIZE; 4104 return -EMSGSIZE;
4102 } 4105 }
4103 4106
4104 return nlmsg_end(skb, nlh); 4107 nlmsg_end(skb, nlh);
4108 return 0;
4105} 4109}
4106 4110
4107enum addr_type_t { 4111enum addr_type_t {
@@ -4134,7 +4138,7 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
4134 cb->nlh->nlmsg_seq, 4138 cb->nlh->nlmsg_seq,
4135 RTM_NEWADDR, 4139 RTM_NEWADDR,
4136 NLM_F_MULTI); 4140 NLM_F_MULTI);
4137 if (err <= 0) 4141 if (err < 0)
4138 break; 4142 break;
4139 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 4143 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
4140 } 4144 }
@@ -4151,7 +4155,7 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
4151 cb->nlh->nlmsg_seq, 4155 cb->nlh->nlmsg_seq,
4152 RTM_GETMULTICAST, 4156 RTM_GETMULTICAST,
4153 NLM_F_MULTI); 4157 NLM_F_MULTI);
4154 if (err <= 0) 4158 if (err < 0)
4155 break; 4159 break;
4156 } 4160 }
4157 break; 4161 break;
@@ -4166,7 +4170,7 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
4166 cb->nlh->nlmsg_seq, 4170 cb->nlh->nlmsg_seq,
4167 RTM_GETANYCAST, 4171 RTM_GETANYCAST,
4168 NLM_F_MULTI); 4172 NLM_F_MULTI);
4169 if (err <= 0) 4173 if (err < 0)
4170 break; 4174 break;
4171 } 4175 }
4172 break; 4176 break;
@@ -4638,7 +4642,8 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
4638 goto nla_put_failure; 4642 goto nla_put_failure;
4639 4643
4640 nla_nest_end(skb, protoinfo); 4644 nla_nest_end(skb, protoinfo);
4641 return nlmsg_end(skb, nlh); 4645 nlmsg_end(skb, nlh);
4646 return 0;
4642 4647
4643nla_put_failure: 4648nla_put_failure:
4644 nlmsg_cancel(skb, nlh); 4649 nlmsg_cancel(skb, nlh);
@@ -4670,7 +4675,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
4670 if (inet6_fill_ifinfo(skb, idev, 4675 if (inet6_fill_ifinfo(skb, idev,
4671 NETLINK_CB(cb->skb).portid, 4676 NETLINK_CB(cb->skb).portid,
4672 cb->nlh->nlmsg_seq, 4677 cb->nlh->nlmsg_seq,
4673 RTM_NEWLINK, NLM_F_MULTI) <= 0) 4678 RTM_NEWLINK, NLM_F_MULTI) < 0)
4674 goto out; 4679 goto out;
4675cont: 4680cont:
4676 idx++; 4681 idx++;
@@ -4747,7 +4752,8 @@ static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
4747 ci.valid_time = ntohl(pinfo->valid); 4752 ci.valid_time = ntohl(pinfo->valid);
4748 if (nla_put(skb, PREFIX_CACHEINFO, sizeof(ci), &ci)) 4753 if (nla_put(skb, PREFIX_CACHEINFO, sizeof(ci), &ci))
4749 goto nla_put_failure; 4754 goto nla_put_failure;
4750 return nlmsg_end(skb, nlh); 4755 nlmsg_end(skb, nlh);
4756 return 0;
4751 4757
4752nla_put_failure: 4758nla_put_failure:
4753 nlmsg_cancel(skb, nlh); 4759 nlmsg_cancel(skb, nlh);
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
index fd0dc47f471d..e43e79d0a612 100644
--- a/net/ipv6/addrlabel.c
+++ b/net/ipv6/addrlabel.c
@@ -490,7 +490,8 @@ static int ip6addrlbl_fill(struct sk_buff *skb,
490 return -EMSGSIZE; 490 return -EMSGSIZE;
491 } 491 }
492 492
493 return nlmsg_end(skb, nlh); 493 nlmsg_end(skb, nlh);
494 return 0;
494} 495}
495 496
496static int ip6addrlbl_dump(struct sk_buff *skb, struct netlink_callback *cb) 497static int ip6addrlbl_dump(struct sk_buff *skb, struct netlink_callback *cb)
@@ -510,7 +511,7 @@ static int ip6addrlbl_dump(struct sk_buff *skb, struct netlink_callback *cb)
510 cb->nlh->nlmsg_seq, 511 cb->nlh->nlmsg_seq,
511 RTM_NEWADDRLABEL, 512 RTM_NEWADDRLABEL,
512 NLM_F_MULTI); 513 NLM_F_MULTI);
513 if (err <= 0) 514 if (err < 0)
514 break; 515 break;
515 } 516 }
516 idx++; 517 idx++;
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 03c520a4ebeb..53775ee7d376 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -277,7 +277,6 @@ static int fib6_dump_node(struct fib6_walker *w)
277 w->leaf = rt; 277 w->leaf = rt;
278 return 1; 278 return 1;
279 } 279 }
280 WARN_ON(res == 0);
281 } 280 }
282 w->leaf = NULL; 281 w->leaf = NULL;
283 return 0; 282 return 0;
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 722669754bbf..34b682617f50 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -2388,7 +2388,8 @@ static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
2388 if (err < 0 && err != -ENOENT) 2388 if (err < 0 && err != -ENOENT)
2389 goto nla_put_failure; 2389 goto nla_put_failure;
2390 2390
2391 return nlmsg_end(skb, nlh); 2391 nlmsg_end(skb, nlh);
2392 return 0;
2392 2393
2393nla_put_failure: 2394nla_put_failure:
2394 nlmsg_cancel(skb, nlh); 2395 nlmsg_cancel(skb, nlh);
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 34dcbb59df75..c60f15775c53 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2725,7 +2725,8 @@ static int rt6_fill_node(struct net *net,
2725 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0) 2725 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0)
2726 goto nla_put_failure; 2726 goto nla_put_failure;
2727 2727
2728 return nlmsg_end(skb, nlh); 2728 nlmsg_end(skb, nlh);
2729 return 0;
2729 2730
2730nla_put_failure: 2731nla_put_failure:
2731 nlmsg_cancel(skb, nlh); 2732 nlmsg_cancel(skb, nlh);