diff options
author | David S. Miller <davem@davemloft.net> | 2012-04-01 20:12:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-02 04:33:42 -0400 |
commit | a6574349d068cb393ae547ee556e682e5fdb2ff3 (patch) | |
tree | 62e7baece5a61271c338d4663fa02504af0b0242 /net/core | |
parent | 9a6308d74edb791c05d0e292e6263efc69640942 (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.c | 67 |
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); |