diff options
Diffstat (limited to 'net/xfrm/xfrm_output.c')
| -rw-r--r-- | net/xfrm/xfrm_output.c | 9 | 
1 files changed, 3 insertions, 6 deletions
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index b1db55b50ba1..fafc7aba705f 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c @@ -533,7 +533,7 @@ static int xfrm_output2(struct net *net, struct sock *sk, struct sk_buff *skb)  static int xfrm_output_gso(struct net *net, struct sock *sk, struct sk_buff *skb)  { -	struct sk_buff *segs; +	struct sk_buff *segs, *nskb;  	BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_SGO_CB_OFFSET);  	BUILD_BUG_ON(sizeof(*IP6CB(skb)) > SKB_SGO_CB_OFFSET); @@ -544,8 +544,7 @@ static int xfrm_output_gso(struct net *net, struct sock *sk, struct sk_buff *skb  	if (segs == NULL)  		return -EINVAL; -	do { -		struct sk_buff *nskb = segs->next; +	skb_list_walk_safe(segs, segs, nskb) {  		int err;  		skb_mark_not_on_list(segs); @@ -555,9 +554,7 @@ static int xfrm_output_gso(struct net *net, struct sock *sk, struct sk_buff *skb  			kfree_skb_list(nskb);  			return err;  		} - -		segs = nskb; -	} while (segs); +	}  	return 0;  }  |