aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-04-01 20:12:00 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-02 04:33:42 -0400
commita6574349d068cb393ae547ee556e682e5fdb2ff3 (patch)
tree62e7baece5a61271c338d4663fa02504af0b0242 /net/core
parent9a6308d74edb791c05d0e292e6263efc69640942 (diff)
rtnetlink: Stop using NLA_PUT*().
These macros contain a hidden goto, and are thus extremely error prone and make code hard to audit. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/rtnetlink.c67
1 files changed, 35 insertions, 32 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 1a63c6efd2ea..71a1920a23a1 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -608,7 +608,8 @@ int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics)
608 for (i = 0; i < RTAX_MAX; i++) { 608 for (i = 0; i < RTAX_MAX; i++) {
609 if (metrics[i]) { 609 if (metrics[i]) {
610 valid++; 610 valid++;
611 NLA_PUT_U32(skb, i+1, metrics[i]); 611 if (nla_put_u32(skb, i+1, metrics[i]))
612 goto nla_put_failure;
612 } 613 }
613 } 614 }
614 615
@@ -808,7 +809,8 @@ static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
808 vf_port = nla_nest_start(skb, IFLA_VF_PORT); 809 vf_port = nla_nest_start(skb, IFLA_VF_PORT);
809 if (!vf_port) 810 if (!vf_port)
810 goto nla_put_failure; 811 goto nla_put_failure;
811 NLA_PUT_U32(skb, IFLA_PORT_VF, vf); 812 if (nla_put_u32(skb, IFLA_PORT_VF, vf))
813 goto nla_put_failure;
812 err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb); 814 err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb);
813 if (err == -EMSGSIZE) 815 if (err == -EMSGSIZE)
814 goto nla_put_failure; 816 goto nla_put_failure;
@@ -892,25 +894,22 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
892 ifm->ifi_flags = dev_get_flags(dev); 894 ifm->ifi_flags = dev_get_flags(dev);
893 ifm->ifi_change = change; 895 ifm->ifi_change = change;
894 896
895 NLA_PUT_STRING(skb, IFLA_IFNAME, dev->name); 897 if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
896 NLA_PUT_U32(skb, IFLA_TXQLEN, dev->tx_queue_len); 898 nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) ||
897 NLA_PUT_U8(skb, IFLA_OPERSTATE, 899 nla_put_u8(skb, IFLA_OPERSTATE,
898 netif_running(dev) ? dev->operstate : IF_OPER_DOWN); 900 netif_running(dev) ? dev->operstate : IF_OPER_DOWN) ||
899 NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode); 901 nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) ||
900 NLA_PUT_U32(skb, IFLA_MTU, dev->mtu); 902 nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
901 NLA_PUT_U32(skb, IFLA_GROUP, dev->group); 903 nla_put_u32(skb, IFLA_GROUP, dev->group) ||
902 904 (dev->ifindex != dev->iflink &&
903 if (dev->ifindex != dev->iflink) 905 nla_put_u32(skb, IFLA_LINK, dev->iflink)) ||
904 NLA_PUT_U32(skb, IFLA_LINK, dev->iflink); 906 (dev->master &&
905 907 nla_put_u32(skb, IFLA_MASTER, dev->master->ifindex)) ||
906 if (dev->master) 908 (dev->qdisc &&
907 NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex); 909 nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
908 910 (dev->ifalias &&
909 if (dev->qdisc) 911 nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)))
910 NLA_PUT_STRING(skb, IFLA_QDISC, dev->qdisc->ops->id); 912 goto nla_put_failure;
911
912 if (dev->ifalias)
913 NLA_PUT_STRING(skb, IFLA_IFALIAS, dev->ifalias);
914 913
915 if (1) { 914 if (1) {
916 struct rtnl_link_ifmap map = { 915 struct rtnl_link_ifmap map = {
@@ -921,12 +920,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
921 .dma = dev->dma, 920 .dma = dev->dma,
922 .port = dev->if_port, 921 .port = dev->if_port,
923 }; 922 };
924 NLA_PUT(skb, IFLA_MAP, sizeof(map), &map); 923 if (nla_put(skb, IFLA_MAP, sizeof(map), &map))
924 goto nla_put_failure;
925 } 925 }
926 926
927 if (dev->addr_len) { 927 if (dev->addr_len) {
928 NLA_PUT(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr); 928 if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
929 NLA_PUT(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast); 929 nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
930 goto nla_put_failure;
930 } 931 }
931 932
932 attr = nla_reserve(skb, IFLA_STATS, 933 attr = nla_reserve(skb, IFLA_STATS,
@@ -943,8 +944,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
943 goto nla_put_failure; 944 goto nla_put_failure;
944 copy_rtnl_link_stats64(nla_data(attr), stats); 945 copy_rtnl_link_stats64(nla_data(attr), stats);
945 946
946 if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF)) 947 if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF) &&
947 NLA_PUT_U32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)); 948 nla_put_u32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)))
949 goto nla_put_failure;
948 950
949 if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent 951 if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent
950 && (ext_filter_mask & RTEXT_FILTER_VF)) { 952 && (ext_filter_mask & RTEXT_FILTER_VF)) {
@@ -987,12 +989,13 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
987 nla_nest_cancel(skb, vfinfo); 989 nla_nest_cancel(skb, vfinfo);
988 goto nla_put_failure; 990 goto nla_put_failure;
989 } 991 }
990 NLA_PUT(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac); 992 if (nla_put(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac) ||
991 NLA_PUT(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan); 993 nla_put(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan) ||
992 NLA_PUT(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate), 994 nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
993 &vf_tx_rate); 995 &vf_tx_rate) ||
994 NLA_PUT(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk), 996 nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
995 &vf_spoofchk); 997 &vf_spoofchk))
998 goto nla_put_failure;
996 nla_nest_end(skb, vf); 999 nla_nest_end(skb, vf);
997 } 1000 }
998 nla_nest_end(skb, vfinfo); 1001 nla_nest_end(skb, vfinfo);