| From c732e40f3dfbae84b1ae352deeebb316e1c15437 Mon Sep 17 00:00:00 2001 |
| From: Herbert Xu <herbert@gondor.apana.org.au> |
| Date: Thu, 29 Jan 2009 16:07:52 -0800 |
| Subject: net: Fix frag_list handling in skb_seq_read |
| |
| From: Herbert Xu <herbert@gondor.apana.org.au> |
| |
| [ Upstream commit 95e3b24cfb4ec0479d2c42f7a1780d68063a542a ] |
| |
| The frag_list handling was broken in skb_seq_read: |
| |
| 1) We didn't add the stepped offset when looking at the head |
| are of fragments other than the first. |
| |
| 2) We didn't take the stepped offset away when setting the data |
| pointer in the head area. |
| |
| 3) The frag index wasn't reset. |
| |
| This patch fixes both issues. |
| |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/core/skbuff.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/net/core/skbuff.c |
| +++ b/net/core/skbuff.c |
| @@ -2001,10 +2001,10 @@ unsigned int skb_seq_read(unsigned int c |
| return 0; |
| |
| next_skb: |
| - block_limit = skb_headlen(st->cur_skb); |
| + block_limit = skb_headlen(st->cur_skb) + st->stepped_offset; |
| |
| if (abs_offset < block_limit) { |
| - *data = st->cur_skb->data + abs_offset; |
| + *data = st->cur_skb->data + (abs_offset - st->stepped_offset); |
| return block_limit - abs_offset; |
| } |
| |
| @@ -2046,6 +2046,7 @@ next_skb: |
| } else if (st->root_skb == st->cur_skb && |
| skb_shinfo(st->root_skb)->frag_list) { |
| st->cur_skb = skb_shinfo(st->root_skb)->frag_list; |
| + st->frag_idx = 0; |
| goto next_skb; |
| } |
| |