ipsec: check return value of skb_to_sgvec always
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Cc: Steffen Klassert <steffen.klassert@secunet.com> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: "David S. Miller" <davem@davemloft.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									48a1df6533
								
							
						
					
					
						commit
						3f29770723
					
				| @ -220,7 +220,9 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb) | |||||||
| 	ah->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | 	ah->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags + sglists); | 	sg_init_table(sg, nfrags + sglists); | ||||||
| 	skb_to_sgvec_nomark(skb, sg, 0, skb->len); | 	err = skb_to_sgvec_nomark(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto out_free; | ||||||
| 
 | 
 | ||||||
| 	if (x->props.flags & XFRM_STATE_ESN) { | 	if (x->props.flags & XFRM_STATE_ESN) { | ||||||
| 		/* Attach seqhi sg right after packet payload */ | 		/* Attach seqhi sg right after packet payload */ | ||||||
| @ -393,7 +395,9 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||||||
| 	skb_push(skb, ihl); | 	skb_push(skb, ihl); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags + sglists); | 	sg_init_table(sg, nfrags + sglists); | ||||||
| 	skb_to_sgvec_nomark(skb, sg, 0, skb->len); | 	err = skb_to_sgvec_nomark(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto out_free; | ||||||
| 
 | 
 | ||||||
| 	if (x->props.flags & XFRM_STATE_ESN) { | 	if (x->props.flags & XFRM_STATE_ESN) { | ||||||
| 		/* Attach seqhi sg right after packet payload */ | 		/* Attach seqhi sg right after packet payload */ | ||||||
|  | |||||||
| @ -377,9 +377,11 @@ int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * | |||||||
| 	esp->esph = esph; | 	esp->esph = esph; | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, esp->nfrags); | 	sg_init_table(sg, esp->nfrags); | ||||||
| 	skb_to_sgvec(skb, sg, | 	err = skb_to_sgvec(skb, sg, | ||||||
| 		     (unsigned char *)esph - skb->data, | 		           (unsigned char *)esph - skb->data, | ||||||
| 		     assoclen + ivlen + esp->clen + alen); | 		           assoclen + ivlen + esp->clen + alen); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto error; | ||||||
| 
 | 
 | ||||||
| 	if (!esp->inplace) { | 	if (!esp->inplace) { | ||||||
| 		int allocsize; | 		int allocsize; | ||||||
| @ -403,9 +405,11 @@ int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * | |||||||
| 		spin_unlock_bh(&x->lock); | 		spin_unlock_bh(&x->lock); | ||||||
| 
 | 
 | ||||||
| 		sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1); | 		sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1); | ||||||
| 		skb_to_sgvec(skb, dsg, | 		err = skb_to_sgvec(skb, dsg, | ||||||
| 			     (unsigned char *)esph - skb->data, | 			           (unsigned char *)esph - skb->data, | ||||||
| 			     assoclen + ivlen + esp->clen + alen); | 			           assoclen + ivlen + esp->clen + alen); | ||||||
|  | 		if (unlikely(err < 0)) | ||||||
|  | 			goto error; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if ((x->props.flags & XFRM_STATE_ESN)) | 	if ((x->props.flags & XFRM_STATE_ESN)) | ||||||
| @ -690,7 +694,9 @@ skip_cow: | |||||||
| 	esp_input_set_header(skb, seqhi); | 	esp_input_set_header(skb, seqhi); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags); | 	sg_init_table(sg, nfrags); | ||||||
| 	skb_to_sgvec(skb, sg, 0, skb->len); | 	err = skb_to_sgvec(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto out; | ||||||
| 
 | 
 | ||||||
| 	skb->ip_summed = CHECKSUM_NONE; | 	skb->ip_summed = CHECKSUM_NONE; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -423,7 +423,9 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||||||
| 	ah->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | 	ah->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags + sglists); | 	sg_init_table(sg, nfrags + sglists); | ||||||
| 	skb_to_sgvec_nomark(skb, sg, 0, skb->len); | 	err = skb_to_sgvec_nomark(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto out_free; | ||||||
| 
 | 
 | ||||||
| 	if (x->props.flags & XFRM_STATE_ESN) { | 	if (x->props.flags & XFRM_STATE_ESN) { | ||||||
| 		/* Attach seqhi sg right after packet payload */ | 		/* Attach seqhi sg right after packet payload */ | ||||||
| @ -606,7 +608,9 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) | |||||||
| 	ip6h->hop_limit   = 0; | 	ip6h->hop_limit   = 0; | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags + sglists); | 	sg_init_table(sg, nfrags + sglists); | ||||||
| 	skb_to_sgvec_nomark(skb, sg, 0, skb->len); | 	err = skb_to_sgvec_nomark(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto out_free; | ||||||
| 
 | 
 | ||||||
| 	if (x->props.flags & XFRM_STATE_ESN) { | 	if (x->props.flags & XFRM_STATE_ESN) { | ||||||
| 		/* Attach seqhi sg right after packet payload */ | 		/* Attach seqhi sg right after packet payload */ | ||||||
|  | |||||||
| @ -346,9 +346,11 @@ int esp6_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info | |||||||
| 	esph = esp_output_set_esn(skb, x, ip_esp_hdr(skb), seqhi); | 	esph = esp_output_set_esn(skb, x, ip_esp_hdr(skb), seqhi); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, esp->nfrags); | 	sg_init_table(sg, esp->nfrags); | ||||||
| 	skb_to_sgvec(skb, sg, | 	err = skb_to_sgvec(skb, sg, | ||||||
| 		     (unsigned char *)esph - skb->data, | 		           (unsigned char *)esph - skb->data, | ||||||
| 		     assoclen + ivlen + esp->clen + alen); | 		           assoclen + ivlen + esp->clen + alen); | ||||||
|  | 	if (unlikely(err < 0)) | ||||||
|  | 		goto error; | ||||||
| 
 | 
 | ||||||
| 	if (!esp->inplace) { | 	if (!esp->inplace) { | ||||||
| 		int allocsize; | 		int allocsize; | ||||||
| @ -372,9 +374,11 @@ int esp6_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info | |||||||
| 		spin_unlock_bh(&x->lock); | 		spin_unlock_bh(&x->lock); | ||||||
| 
 | 
 | ||||||
| 		sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1); | 		sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1); | ||||||
| 		skb_to_sgvec(skb, dsg, | 		err = skb_to_sgvec(skb, dsg, | ||||||
| 			     (unsigned char *)esph - skb->data, | 			           (unsigned char *)esph - skb->data, | ||||||
| 			     assoclen + ivlen + esp->clen + alen); | 			           assoclen + ivlen + esp->clen + alen); | ||||||
|  | 		if (unlikely(err < 0)) | ||||||
|  | 			goto error; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if ((x->props.flags & XFRM_STATE_ESN)) | 	if ((x->props.flags & XFRM_STATE_ESN)) | ||||||
| @ -618,7 +622,9 @@ skip_cow: | |||||||
| 	esp_input_set_header(skb, seqhi); | 	esp_input_set_header(skb, seqhi); | ||||||
| 
 | 
 | ||||||
| 	sg_init_table(sg, nfrags); | 	sg_init_table(sg, nfrags); | ||||||
| 	skb_to_sgvec(skb, sg, 0, skb->len); | 	ret = skb_to_sgvec(skb, sg, 0, skb->len); | ||||||
|  | 	if (unlikely(ret < 0)) | ||||||
|  | 		goto out; | ||||||
| 
 | 
 | ||||||
| 	skb->ip_summed = CHECKSUM_NONE; | 	skb->ip_summed = CHECKSUM_NONE; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user