From b15503f810033a52fbb31252e24db2465ebe15db Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Fri, 27 Jun 2008 17:27:21 -0700 Subject: [PATCH] --- yaml --- r: 98559 b: refs/heads/master c: db43a282d3ec92ea45109c5551fff3dcc5afef02 h: refs/heads/master i: 98557: dd286b6bc4d522390b4ddc09dc24a077770c3623 98555: 218917f2f42182faadd619f1c479fa05fbbc9bd9 98551: bcf0aabb4b9e1f8ced3de7a6105a0579cf3d5a66 98543: b49f52a98361d4109624b62fe79c38cafdce4ce9 98527: 9a912ba34d5bb18cbbf1e7792311a3a9d3a884e4 98495: 597b1963912c5f1c6e55da1f1cbea882e7cfdceb 98431: a3b24e68464f26f7b75355186e687877ee559706 98303: 8d3fd52306c01a77327e5a8547cc363fa60bb45f v: v3 --- [refs] | 2 +- trunk/net/core/skbuff.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index c18e4057cdd7..7780c43e2bd9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 57413ebc4e0f1e471a3b4db4aff9a85c083d090e +refs/heads/master: db43a282d3ec92ea45109c5551fff3dcc5afef02 diff --git a/trunk/net/core/skbuff.c b/trunk/net/core/skbuff.c index 1e556d312117..366621610e76 100644 --- a/trunk/net/core/skbuff.c +++ b/trunk/net/core/skbuff.c @@ -1292,12 +1292,14 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, { unsigned int nr_pages = spd->nr_pages; unsigned int poff, plen, len, toff, tlen; - int headlen, seg; + int headlen, seg, error = 0; toff = *offset; tlen = *total_len; - if (!tlen) + if (!tlen) { + error = 1; goto err; + } /* * if the offset is greater than the linear part, go directly to @@ -1339,7 +1341,8 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, * just jump directly to update and return, no point * in going over fragments when the output is full. */ - if (spd_fill_page(spd, virt_to_page(p), plen, poff, skb)) + error = spd_fill_page(spd, virt_to_page(p), plen, poff, skb); + if (error) goto done; tlen -= plen; @@ -1369,7 +1372,8 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, if (!plen) break; - if (spd_fill_page(spd, f->page, plen, poff, skb)) + error = spd_fill_page(spd, f->page, plen, poff, skb); + if (error) break; tlen -= plen; @@ -1382,7 +1386,10 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, return 0; } err: - return 1; + /* update the offset to reflect the linear part skip, if any */ + if (!error) + *offset = toff; + return error; } /*