Message ID | 20171024234442.1464-1-ysseung@google.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net] tcp: call tcp_rate_skb_sent() when retransmit with unaligned skb->data | expand |
From: Yousuk Seung <ysseung@google.com> Date: Tue, 24 Oct 2017 16:44:42 -0700 > Current implementation calls tcp_rate_skb_sent() when tcp_transmit_skb() > is called when it clones skb only. Not calling tcp_rate_skb_sent() is OK > for all such code paths except from __tcp_retransmit_skb() which happens > when skb->data address is not aligned. This may rarely happen e.g. when > small amount of data is sent initially and the receiver partially acks > odd number of bytes for some reason, possibly malicious. > > Signed-off-by: Yousuk Seung <ysseung@google.com> > Signed-off-by: Neal Cardwell <ncardwell@google.com> > Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com> > Acked-by: Eric Dumazet <edumazet@google.com> This doesn't apply to any of m trees.
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 973befc36fd4..1151870018e3 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2843,8 +2843,10 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs) nskb = __pskb_copy(skb, MAX_TCP_HEADER, GFP_ATOMIC); err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : -ENOBUFS; - if (!err) + if (!err) { skb->skb_mstamp = tp->tcp_mstamp; + tcp_rate_skb_sent(sk, skb); + } } else { err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); }