mirror of https://gitee.com/openkylin/linux.git
net: fix GSO for SG-enabled devices
The commitdbd50f238d
("net: move the hsize check to the else block in skb_segment") introduced a data corruption for devices supporting scatter-gather. The problem boils down to signed/unsigned comparison given unexpected results: if signed 'hsize' is negative, it will be considered greater than a positive 'len', which is unsigned. This commit addresses resorting to the old checks order, so that 'hsize' never has a negative value when compared with 'len'. v1 -> v2: - reorder hsize checks instead of explicit cast (Alex) Bisected-by: Matthieu Baerts <matthieu.baerts@tessares.net> Fixes:dbd50f238d
("net: move the hsize check to the else block in skb_segment") Signed-off-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Xin Long <lucien.xin@gmail.com> Link: https://lore.kernel.org/r/861947c2d2d087db82af93c21920ce8147d15490.1611074818.git.pabeni@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
fc6f89dd8c
commit
00b229f762
|
@ -3938,10 +3938,10 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
|||
skb_release_head_state(nskb);
|
||||
__skb_push(nskb, doffset);
|
||||
} else {
|
||||
if (hsize < 0)
|
||||
hsize = 0;
|
||||
if (hsize > len || !sg)
|
||||
hsize = len;
|
||||
else if (hsize < 0)
|
||||
hsize = 0;
|
||||
|
||||
nskb = __alloc_skb(hsize + doffset + headroom,
|
||||
GFP_ATOMIC, skb_alloc_rx_flag(head_skb),
|
||||
|
|
Loading…
Reference in New Issue