diff options
Diffstat (limited to 'net/xfrm/xfrm_algo.c')
| -rw-r--r-- | net/xfrm/xfrm_algo.c | 22 | 
1 files changed, 8 insertions, 14 deletions
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 6249a9405bb8..be529c4241a6 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c @@ -532,8 +532,8 @@ EXPORT_SYMBOL_GPL(xfrm_count_enc_supported);  int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  		 int offset, int len, icv_update_fn_t icv_update)  { -	int start = skb_headlen(skb); -	int i, copy = start - offset; +	int end = skb_headlen(skb); +	int i, copy = end - offset;  	int err;  	struct scatterlist sg; @@ -556,11 +556,9 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  	}  	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -		int end; +		BUG_TRAP(len >= 0); -		BUG_TRAP(start <= offset + len); - -		end = start + skb_shinfo(skb)->frags[i].size; +		end = offset + skb_shinfo(skb)->frags[i].size;  		if ((copy = end - offset) > 0) {  			skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; @@ -568,7 +566,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  				copy = len;  			sg.page = frag->page; -			sg.offset = frag->page_offset + offset-start; +			sg.offset = frag->page_offset;  			sg.length = copy;  			err = icv_update(desc, &sg, copy); @@ -579,22 +577,19 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  				return 0;  			offset += copy;  		} -		start = end;  	}  	if (skb_shinfo(skb)->frag_list) {  		struct sk_buff *list = skb_shinfo(skb)->frag_list;  		for (; list; list = list->next) { -			int end; - -			BUG_TRAP(start <= offset + len); +			BUG_TRAP(len >= 0); -			end = start + list->len; +			end = offset + list->len;  			if ((copy = end - offset) > 0) {  				if (copy > len)  					copy = len; -				err = skb_icv_walk(list, desc, offset-start, +				err = skb_icv_walk(list, desc, 0,  						   copy, icv_update);  				if (unlikely(err))  					return err; @@ -602,7 +597,6 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  					return 0;  				offset += copy;  			} -			start = end;  		}  	}  	BUG_ON(len);  | 
