fib_rules: Stop using NLA_PUT*().
authorDavid S. Miller <davem@davemloft.net>
Mon, 2 Apr 2012 00:47:01 +0000 (20:47 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Apr 2012 08:33:44 +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>
net/core/fib_rules.c

index c02e63c908da6972228735ba247dfcda6798b233..72cceb79d0d4f9bd869fa828a7d04152487be5c7 100644 (file)
@@ -542,7 +542,8 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule,
        frh = nlmsg_data(nlh);
        frh->family = ops->family;
        frh->table = rule->table;
-       NLA_PUT_U32(skb, FRA_TABLE, rule->table);
+       if (nla_put_u32(skb, FRA_TABLE, rule->table))
+               goto nla_put_failure;
        frh->res1 = 0;
        frh->res2 = 0;
        frh->action = rule->action;
@@ -553,31 +554,28 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule,
                frh->flags |= FIB_RULE_UNRESOLVED;
 
        if (rule->iifname[0]) {
-               NLA_PUT_STRING(skb, FRA_IIFNAME, rule->iifname);
-
+               if (nla_put_string(skb, FRA_IIFNAME, rule->iifname))
+                       goto nla_put_failure;
                if (rule->iifindex == -1)
                        frh->flags |= FIB_RULE_IIF_DETACHED;
        }
 
        if (rule->oifname[0]) {
-               NLA_PUT_STRING(skb, FRA_OIFNAME, rule->oifname);
-
+               if (nla_put_string(skb, FRA_OIFNAME, rule->oifname))
+                       goto nla_put_failure;
                if (rule->oifindex == -1)
                        frh->flags |= FIB_RULE_OIF_DETACHED;
        }
 
-       if (rule->pref)
-               NLA_PUT_U32(skb, FRA_PRIORITY, rule->pref);
-
-       if (rule->mark)
-               NLA_PUT_U32(skb, FRA_FWMARK, rule->mark);
-
-       if (rule->mark_mask || rule->mark)
-               NLA_PUT_U32(skb, FRA_FWMASK, rule->mark_mask);
-
-       if (rule->target)
-               NLA_PUT_U32(skb, FRA_GOTO, rule->target);
-
+       if ((rule->pref &&
+            nla_put_u32(skb, FRA_PRIORITY, rule->pref)) ||
+           (rule->mark &&
+            nla_put_u32(skb, FRA_FWMARK, rule->mark)) ||
+           ((rule->mark_mask || rule->mark) &&
+            nla_put_u32(skb, FRA_FWMASK, rule->mark_mask)) ||
+           (rule->target &&
+            nla_put_u32(skb, FRA_GOTO, rule->target)))
+               goto nla_put_failure;
        if (ops->fill(rule, skb, frh) < 0)
                goto nla_put_failure;