mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
net: netem: fix error path for corrupted GSO frames
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. Commit177b800746
("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. Fixes:177b800746
("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> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bd310aca44
commit
a7fa12d158
@ -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;
|
||||
}
|
||||
|
||||
@ -593,9 +594,10 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
finish_segs:
|
||||
if (segs) {
|
||||
unsigned int len, last_len;
|
||||
int nb = 0;
|
||||
int nb;
|
||||
|
||||
len = skb->len;
|
||||
len = skb ? skb->len : 0;
|
||||
nb = skb ? 1 : 0;
|
||||
|
||||
while (segs) {
|
||||
skb2 = segs->next;
|
||||
@ -612,7 +614,8 @@ finish_segs:
|
||||
}
|
||||
segs = skb2;
|
||||
}
|
||||
qdisc_tree_reduce_backlog(sch, -nb, prev_len - len);
|
||||
/* Parent qdiscs accounted for 1 skb of size @prev_len */
|
||||
qdisc_tree_reduce_backlog(sch, -(nb - 1), -(len - prev_len));
|
||||
}
|
||||
return NET_XMIT_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user