lkml.org 
[lkml]   [2017]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 03/25] tcp: do not mangle skb->cb[] in tcp_make_synack()
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Eric Dumazet <edumazet@google.com>


    [ Upstream commit 3b11775033dc87c3d161996c54507b15ba26414a ]

    Christoph Paasch sent a patch to address the following issue :

    tcp_make_synack() is leaving some TCP private info in skb->cb[],
    then send the packet by other means than tcp_transmit_skb()

    tcp_transmit_skb() makes sure to clear skb->cb[] to not confuse
    IPv4/IPV6 stacks, but we have no such cleanup for SYNACK.

    tcp_make_synack() should not use tcp_init_nondata_skb() :

    tcp_init_nondata_skb() really should be limited to skbs put in write/rtx
    queues (the ones that are only sent via tcp_transmit_skb())

    This patch fixes the issue and should even save few cpu cycles ;)

    Fixes: 971f10eca186 ("tcp: better TCP_SKB_CB layout to reduce cache line misses")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Christoph Paasch <cpaasch@apple.com>
    Reviewed-by: Christoph Paasch <cpaasch@apple.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv4/tcp_output.c | 9 ++-------
    1 file changed, 2 insertions(+), 7 deletions(-)

    --- a/net/ipv4/tcp_output.c
    +++ b/net/ipv4/tcp_output.c
    @@ -3110,13 +3110,8 @@ struct sk_buff *tcp_make_synack(const st
    tcp_ecn_make_synack(req, th);
    th->source = htons(ireq->ir_num);
    th->dest = ireq->ir_rmt_port;
    - /* Setting of flags are superfluous here for callers (and ECE is
    - * not even correctly set)
    - */
    - tcp_init_nondata_skb(skb, tcp_rsk(req)->snt_isn,
    - TCPHDR_SYN | TCPHDR_ACK);
    -
    - th->seq = htonl(TCP_SKB_CB(skb)->seq);
    + skb->ip_summed = CHECKSUM_PARTIAL;
    + th->seq = htonl(tcp_rsk(req)->snt_isn);
    /* XXX data is queued and acked as is. No buffer/window check */
    th->ack_seq = htonl(tcp_rsk(req)->rcv_nxt);


    \
     
     \ /
      Last update: 2017-11-22 11:28    [W:3.566 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site