From 6afcb89b4438ef6fa8f969f95eaf105b611a346c Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 15 Oct 2007 01:47:15 -0700 Subject: [PATCH] --- yaml --- r: 69412 b: refs/heads/master c: a030847e9f0eed2a080f6114381c649a7aa43d25 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 6d3a0900b0da..0c5c55804b25 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 172a863f2bfbacf4b6bfc06db219b946a058ce1a +refs/heads/master: a030847e9f0eed2a080f6114381c649a7aa43d25 diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 39aba4862f21..38b03da5c1ca 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -1362,22 +1362,21 @@ int skb_checksum_help(struct sk_buff *skb) goto out_set_summed; } - if (skb_cloned(skb)) { + offset = skb->csum_start - skb_headroom(skb); + BUG_ON(offset >= skb_headlen(skb)); + csum = skb_checksum(skb, offset, skb->len - offset, 0); + + offset += skb->csum_offset; + BUG_ON(offset + sizeof(__sum16) > skb_headlen(skb)); + + if (skb_cloned(skb) && + !skb_clone_writable(skb, offset + sizeof(__sum16))) { ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); if (ret) goto out; } - offset = skb->csum_start - skb_headroom(skb); - BUG_ON(offset > (int)skb->len); - csum = skb_checksum(skb, offset, skb->len-offset, 0); - - offset = skb_headlen(skb) - offset; - BUG_ON(offset <= 0); - BUG_ON(skb->csum_offset + 2 > offset); - - *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = - csum_fold(csum); + *(__sum16 *)(skb->data + offset) = csum_fold(csum); out_set_summed: skb->ip_summed = CHECKSUM_NONE; out: