netlink: Fix bugs in nlmsg_end() conversions.
authorDavid S. Miller <davem@davemloft.net>
Mon, 19 Jan 2015 04:36:08 +0000 (23:36 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 Jan 2015 04:36:08 +0000 (23:36 -0500)
Commit 053c095a82cf ("netlink: make nlmsg_end() and genlmsg_end()
void") didn't catch all of the cases where callers were breaking out
on the return value being equal to zero, which they no longer should
when zero means success.

Fix all such cases.

Reported-by: Marcel Holtmann <marcel@holtmann.org>
Reported-by: Scott Feldman <sfeldma@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/neighbour.c
net/core/rtnetlink.c
net/decnet/dn_route.c
net/ipv4/devinet.c
net/ipv4/route.c
net/ipv6/addrconf.c

index d36d564f149f2fb54d9c67803cd7c564c9c4e028..70fe9e10ac867f495086810dc6ea619f69d59368 100644 (file)
@@ -2128,7 +2128,7 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
 
                if (neightbl_fill_info(skb, tbl, NETLINK_CB(cb->skb).portid,
                                       cb->nlh->nlmsg_seq, RTM_NEWNEIGHTBL,
-                                      NLM_F_MULTI) <= 0)
+                                      NLM_F_MULTI) < 0)
                        break;
 
                nidx = 0;
@@ -2144,7 +2144,7 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
                                                     NETLINK_CB(cb->skb).portid,
                                                     cb->nlh->nlmsg_seq,
                                                     RTM_NEWNEIGHTBL,
-                                                    NLM_F_MULTI) <= 0)
+                                                    NLM_F_MULTI) < 0)
                                goto out;
                next:
                        nidx++;
@@ -2274,7 +2274,7 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                        if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
                                            cb->nlh->nlmsg_seq,
                                            RTM_NEWNEIGH,
-                                           NLM_F_MULTI) <= 0) {
+                                           NLM_F_MULTI) < 0) {
                                rc = -1;
                                goto out;
                        }
@@ -2311,7 +2311,7 @@ static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                        if (pneigh_fill_info(skb, n, NETLINK_CB(cb->skb).portid,
                                            cb->nlh->nlmsg_seq,
                                            RTM_NEWNEIGH,
-                                           NLM_F_MULTI, tbl) <= 0) {
+                                           NLM_F_MULTI, tbl) < 0) {
                                read_unlock_bh(&tbl->lock);
                                rc = -1;
                                goto out;
index e13b9dbdf1546194b23c6b83acb5c09076ab2222..0e26b9f66cad974fef717903bcf11be49726a860 100644 (file)
@@ -1327,7 +1327,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
                         */
                        WARN_ON((err == -EMSGSIZE) && (skb->len == 0));
 
-                       if (err <= 0)
+                       if (err < 0)
                                goto out;
 
                        nl_dump_check_consistent(cb, nlmsg_hdr(skb));
index 812e5e6e88fb7153bf9bc43fd0a22c1ab80d0b51..1d7c1256e8458d35e4a9f9daa392aba37672e1bf 100644 (file)
@@ -1710,9 +1710,6 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
                rt->rt_flags |= RTCF_NOTIFY;
 
        err = dn_rt_fill_info(skb, NETLINK_CB(in_skb).portid, nlh->nlmsg_seq, RTM_NEWROUTE, 0, 0);
-
-       if (err == 0)
-               goto out_free;
        if (err < 0) {
                err = -EMSGSIZE;
                goto out_free;
@@ -1763,7 +1760,7 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
                        skb_dst_set(skb, dst_clone(&rt->dst));
                        if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).portid,
                                        cb->nlh->nlmsg_seq, RTM_NEWROUTE,
-                                       1, NLM_F_MULTI) <= 0) {
+                                       1, NLM_F_MULTI) < 0) {
                                skb_dst_drop(skb);
                                rcu_read_unlock_bh();
                                goto done;
index 5f344eb3fc25a6e3844e6fe1ae79d61c7ab04cc1..59ebe16d06fc2db1c0a3a1d8d2ac3d1c74646c3b 100644 (file)
@@ -1883,7 +1883,7 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb,
                                                      cb->nlh->nlmsg_seq,
                                                      RTM_NEWNETCONF,
                                                      NLM_F_MULTI,
-                                                     -1) <= 0) {
+                                                     -1) < 0) {
                                rcu_read_unlock();
                                goto done;
                        }
@@ -1899,7 +1899,7 @@ cont:
                                              NETLINK_CB(cb->skb).portid,
                                              cb->nlh->nlmsg_seq,
                                              RTM_NEWNETCONF, NLM_F_MULTI,
-                                             -1) <= 0)
+                                             -1) < 0)
                        goto done;
                else
                        h++;
@@ -1910,7 +1910,7 @@ cont:
                                              NETLINK_CB(cb->skb).portid,
                                              cb->nlh->nlmsg_seq,
                                              RTM_NEWNETCONF, NLM_F_MULTI,
-                                             -1) <= 0)
+                                             -1) < 0)
                        goto done;
                else
                        h++;
index f6e43ca5e6412c6d9037d1e2c1281d38414c4646..2000110c75f0a98b9b46967d0902393e68f6eb4d 100644 (file)
@@ -2483,7 +2483,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
        err = rt_fill_info(net, dst, src, &fl4, skb,
                           NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
                           RTM_NEWROUTE, 0, 0);
-       if (err <= 0)
+       if (err < 0)
                goto errout_free;
 
        err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
index 8975d9501d50d0916536236755bba97fa25d457b..d6b4f5d08014c6ad096019120f2d4c5daf776bc2 100644 (file)
@@ -4213,7 +4213,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                                goto cont;
 
                        if (in6_dump_addrs(idev, skb, cb, type,
-                                          s_ip_idx, &ip_idx) <= 0)
+                                          s_ip_idx, &ip_idx) < 0)
                                goto done;
 cont:
                        idx++;