mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	fib_rules: 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>
This commit is contained in:
		
							parent
							
								
									be51da0f3e
								
							
						
					
					
						commit
						0e3cea7b3c
					
				
					 1 changed files with 15 additions and 17 deletions
				
			
		|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 David S. Miller
						David S. Miller