diff options
Diffstat (limited to 'net/openvswitch/flow.c')
| -rw-r--r-- | net/openvswitch/flow.c | 21 | 
1 files changed, 13 insertions, 8 deletions
| diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 1252c3081ef..6d4d8097cf9 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -183,7 +183,8 @@ void ovs_flow_used(struct sw_flow *flow, struct sk_buff *skb)  	u8 tcp_flags = 0;  	if (flow->key.eth.type == htons(ETH_P_IP) && -	    flow->key.ip.proto == IPPROTO_TCP) { +	    flow->key.ip.proto == IPPROTO_TCP && +	    likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) {  		u8 *tcp = (u8 *)tcp_hdr(skb);  		tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK;  	} @@ -1174,11 +1175,13 @@ int ovs_flow_to_nlattrs(const struct sw_flow_key *swkey, struct sk_buff *skb)  	struct ovs_key_ethernet *eth_key;  	struct nlattr *nla, *encap; -	if (swkey->phy.priority) -		NLA_PUT_U32(skb, OVS_KEY_ATTR_PRIORITY, swkey->phy.priority); +	if (swkey->phy.priority && +	    nla_put_u32(skb, OVS_KEY_ATTR_PRIORITY, swkey->phy.priority)) +		goto nla_put_failure; -	if (swkey->phy.in_port != USHRT_MAX) -		NLA_PUT_U32(skb, OVS_KEY_ATTR_IN_PORT, swkey->phy.in_port); +	if (swkey->phy.in_port != USHRT_MAX && +	    nla_put_u32(skb, OVS_KEY_ATTR_IN_PORT, swkey->phy.in_port)) +		goto nla_put_failure;  	nla = nla_reserve(skb, OVS_KEY_ATTR_ETHERNET, sizeof(*eth_key));  	if (!nla) @@ -1188,8 +1191,9 @@ int ovs_flow_to_nlattrs(const struct sw_flow_key *swkey, struct sk_buff *skb)  	memcpy(eth_key->eth_dst, swkey->eth.dst, ETH_ALEN);  	if (swkey->eth.tci || swkey->eth.type == htons(ETH_P_8021Q)) { -		NLA_PUT_BE16(skb, OVS_KEY_ATTR_ETHERTYPE, htons(ETH_P_8021Q)); -		NLA_PUT_BE16(skb, OVS_KEY_ATTR_VLAN, swkey->eth.tci); +		if (nla_put_be16(skb, OVS_KEY_ATTR_ETHERTYPE, htons(ETH_P_8021Q)) || +		    nla_put_be16(skb, OVS_KEY_ATTR_VLAN, swkey->eth.tci)) +			goto nla_put_failure;  		encap = nla_nest_start(skb, OVS_KEY_ATTR_ENCAP);  		if (!swkey->eth.tci)  			goto unencap; @@ -1200,7 +1204,8 @@ int ovs_flow_to_nlattrs(const struct sw_flow_key *swkey, struct sk_buff *skb)  	if (swkey->eth.type == htons(ETH_P_802_2))  		goto unencap; -	NLA_PUT_BE16(skb, OVS_KEY_ATTR_ETHERTYPE, swkey->eth.type); +	if (nla_put_be16(skb, OVS_KEY_ATTR_ETHERTYPE, swkey->eth.type)) +		goto nla_put_failure;  	if (swkey->eth.type == htons(ETH_P_IP)) {  		struct ovs_key_ipv4 *ipv4_key; | 
