netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net] net: netem: fix error path for corrupted GSO frames
@ 2019-10-16 16:00 Jakub Kicinski
  2019-10-16 22:42 ` Cong Wang
  0 siblings, 1 reply; 6+ messages in thread
From: Jakub Kicinski @ 2019-10-16 16:00 UTC (permalink / raw)
  To: davem
  Cc: netdev, oss-drivers, stephen, Jakub Kicinski, kbuild test robot,
	Dan Carpenter, Ben Hutchings, Simon Horman

To corrupt a GSO frame we first perform segmentation.  We then
proceed using the first segment instead of the full GSO skb and
requeue the rest of the segments as separate packets.

If there are any issues with processing the first segment we
still want to process the rest, therefore we jump to the
finish_segs label.

Commit 177b8007463c ("net: netem: fix backlog accounting for
corrupted GSO frames") started using the pointer to the first
segment in the "rest of segments processing", but as mentioned
above the first segment may had already been freed at this point.

Backlog corrections for parent qdiscs have to be adjusted.
Note that if segmentation ever produced a single-skb list
the backlog calculation will not take place (segs == NULL)
but that should hopefully never happen..

Fixes: 177b8007463c ("net: netem: fix backlog accounting for corrupted GSO frames")
Reported-by: kbuild test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Reported-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
---
 net/sched/sch_netem.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
index 0e44039e729c..31a6afd035b2 100644
--- a/net/sched/sch_netem.c
+++ b/net/sched/sch_netem.c
@@ -509,6 +509,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
 		    skb_checksum_help(skb)) {
 			qdisc_drop(skb, sch, to_free);
+			skb = NULL;
 			goto finish_segs;
 		}
 
@@ -595,7 +596,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 		unsigned int len, last_len;
 		int nb = 0;
 
-		len = skb->len;
+		len = skb ? skb->len : 0;
 
 		while (segs) {
 			skb2 = segs->next;
@@ -612,7 +613,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 			}
 			segs = skb2;
 		}
-		qdisc_tree_reduce_backlog(sch, -nb, prev_len - len);
+		qdisc_tree_reduce_backlog(sch, !skb - nb, prev_len - len);
 	}
 	return NET_XMIT_SUCCESS;
 }
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-10-17 19:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-16 16:00 [PATCH net] net: netem: fix error path for corrupted GSO frames Jakub Kicinski
2019-10-16 22:42 ` Cong Wang
2019-10-16 23:22   ` Jakub Kicinski
2019-10-17 18:10     ` Cong Wang
2019-10-17 18:44       ` Jakub Kicinski
2019-10-17 19:28         ` Cong Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).