team: Stop using NLA_PUT*().
authorDavid S. Miller <davem@davemloft.net>
Mon, 2 Apr 2012 00:25:18 +0000 (20:25 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Apr 2012 08:33:43 +0000 (04:33 -0400)
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>
drivers/net/team/team.c

index 8f81805c6825d6e1aec84068bbf3f533e1c33582..0db6e66ea98d64a0e45ed2d516dbfb6b88627619 100644 (file)
@@ -1248,7 +1248,8 @@ static int team_nl_fill_options_get(struct sk_buff *skb,
        if (IS_ERR(hdr))
                return PTR_ERR(hdr);
 
-       NLA_PUT_U32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex);
+       if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex))
+               goto nla_put_failure;
        option_list = nla_nest_start(skb, TEAM_ATTR_LIST_OPTION);
        if (!option_list)
                return -EMSGSIZE;
@@ -1263,24 +1264,31 @@ static int team_nl_fill_options_get(struct sk_buff *skb,
                option_item = nla_nest_start(skb, TEAM_ATTR_ITEM_OPTION);
                if (!option_item)
                        goto nla_put_failure;
-               NLA_PUT_STRING(skb, TEAM_ATTR_OPTION_NAME, option->name);
+               if (nla_put_string(skb, TEAM_ATTR_OPTION_NAME, option->name))
+                       goto nla_put_failure;
                if (option->changed) {
-                       NLA_PUT_FLAG(skb, TEAM_ATTR_OPTION_CHANGED);
+                       if (nla_put_flag(skb, TEAM_ATTR_OPTION_CHANGED))
+                               goto nla_put_failure;
                        option->changed = false;
                }
-               if (option->removed)
-                       NLA_PUT_FLAG(skb, TEAM_ATTR_OPTION_REMOVED);
+               if (option->removed &&
+                   nla_put_flag(skb, TEAM_ATTR_OPTION_REMOVED))
+                       goto nla_put_failure;
                switch (option->type) {
                case TEAM_OPTION_TYPE_U32:
-                       NLA_PUT_U8(skb, TEAM_ATTR_OPTION_TYPE, NLA_U32);
+                       if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_U32))
+                               goto nla_put_failure;
                        team_option_get(team, option, &arg);
-                       NLA_PUT_U32(skb, TEAM_ATTR_OPTION_DATA, arg);
+                       if (nla_put_u32(skb, TEAM_ATTR_OPTION_DATA, arg))
+                               goto nla_put_failure;
                        break;
                case TEAM_OPTION_TYPE_STRING:
-                       NLA_PUT_U8(skb, TEAM_ATTR_OPTION_TYPE, NLA_STRING);
+                       if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_STRING))
+                               goto nla_put_failure;
                        team_option_get(team, option, &arg);
-                       NLA_PUT_STRING(skb, TEAM_ATTR_OPTION_DATA,
-                                      (char *) arg);
+                       if (nla_put_string(skb, TEAM_ATTR_OPTION_DATA,
+                                          (char *) arg))
+                               goto nla_put_failure;
                        break;
                default:
                        BUG();
@@ -1420,7 +1428,8 @@ static int team_nl_fill_port_list_get(struct sk_buff *skb,
        if (IS_ERR(hdr))
                return PTR_ERR(hdr);
 
-       NLA_PUT_U32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex);
+       if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex))
+               goto nla_put_failure;
        port_list = nla_nest_start(skb, TEAM_ATTR_LIST_PORT);
        if (!port_list)
                return -EMSGSIZE;
@@ -1434,17 +1443,20 @@ static int team_nl_fill_port_list_get(struct sk_buff *skb,
                port_item = nla_nest_start(skb, TEAM_ATTR_ITEM_PORT);
                if (!port_item)
                        goto nla_put_failure;
-               NLA_PUT_U32(skb, TEAM_ATTR_PORT_IFINDEX, port->dev->ifindex);
+               if (nla_put_u32(skb, TEAM_ATTR_PORT_IFINDEX, port->dev->ifindex))
+                       goto nla_put_failure;
                if (port->changed) {
-                       NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_CHANGED);
+                       if (nla_put_flag(skb, TEAM_ATTR_PORT_CHANGED))
+                               goto nla_put_failure;
                        port->changed = false;
                }
-               if (port->removed)
-                       NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_REMOVED);
-               if (port->linkup)
-                       NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_LINKUP);
-               NLA_PUT_U32(skb, TEAM_ATTR_PORT_SPEED, port->speed);
-               NLA_PUT_U8(skb, TEAM_ATTR_PORT_DUPLEX, port->duplex);
+               if ((port->removed &&
+                    nla_put_flag(skb, TEAM_ATTR_PORT_REMOVED)) ||
+                   (port->linkup &&
+                    nla_put_flag(skb, TEAM_ATTR_PORT_LINKUP)) ||
+                   nla_put_u32(skb, TEAM_ATTR_PORT_SPEED, port->speed) ||
+                   nla_put_u8(skb, TEAM_ATTR_PORT_DUPLEX, port->duplex))
+                       goto nla_put_failure;
                nla_nest_end(skb, port_item);
        }