net: Make skb_seq_read unmap the last fragment
Subsystems (2)
PATCH 1/1 net: Make skb_seq_read unmap the last fragment
From: Olaf Kirch <[email protected]>
Make skb_seq_read unmap the last fragment
Having walked through the entire skbuff, skb_seq_read would leave the last fragment mapped. As a consequence, the unwary caller would leak kmaps, and proceed with preempt_count off by one. The only (kind of non-intuitive) workaround is to use skb_seq_read_abort.
This patch makes sure skb_seq_read always unmaps frag_data after having cycled through the skb's paged part.
--- net/core/skbuff.c | 5 +++++ 1 file changed, 5 insertions(+)
net/core/skbuff.c +5 -0
@@ -1706,6 +1706,11 @@ next_skb: st->stepped_offset += frag->size; } +if (st->frag_data) { +kunmap_skb_frag (st->frag_data); + st->frag_data =NULL ; + } +if (st->cur_skb->next) { st->cur_skb = st->cur_skb->next; st->frag_idx =0 ;
Signature · 2 lines
Olaf Kirch | --- o --- Nous sommes du soleil we love when we play [email protected] | / | \ sol.dhoop.naytheet.ah kin.ir.samse.qurax
David Miller
maintainerFrom: Olaf Kirch <[email protected]>
Date: Tue, 19 Jun 2007 09:56:24 +0200
Quoted 9 lines
From: Olaf Kirch <[email protected]>
Make
skb_seq_readunmap the last fragmentHaving walked through the entire skbuff,
skb_seq_readwould leave the last fragment mapped. As a consequence, the unwary caller would leak kmaps, and proceed withpreempt_countoff by one. The only (kind of non-intuitive) workaround is to useskb_seq_read_abort.
Quoted 4 lines
This patch makes sure
skb_seq_readalways unmapsfrag_dataafter having cycled through the skb's paged part.Signed-off-by [email protected]
Thanks for finding and fixing this bug.
Patch applied, thanks again Olaf.