• Eric Dumazet's avatar
    tcp: fix another uninit-value (sk_rx_queue_mapping) · 03cfda4f
    Eric Dumazet authored
    KMSAN is still not happy [1].
    
    I missed that passive connections do not inherit their
    sk_rx_queue_mapping values from the request socket,
    but instead tcp_child_process() is calling
    sk_mark_napi_id(child, skb)
    
    We have many sk_mark_napi_id() callers, so I am providing
    a new helper, forcing the setting sk_rx_queue_mapping
    and sk_napi_id.
    
    Note that we had no KMSAN report for sk_napi_id because
    passive connections got a copy of this field from the listener.
    sk_rx_queue_mapping in the other hand is inside the
    sk_dontcopy_begin/sk_dontcopy_end so sk_clone_lock()
    leaves this field uninitialized.
    
    We might remove dead code populating req->sk_rx_queue_mapping
    in the future.
    
    [1]
    
    BUG: KMSAN: uninit-value in __sk_rx_queue_set include/net/sock.h:1924 [inline]
    BUG: KMSAN: uninit-value in sk_rx_queue_update include/net/sock.h:1938 [inline]
    BUG: KMSAN: uninit-value in sk_mark_napi_id include/net/busy_poll.h:136 [inline]
    BUG: KMSAN: uninit-value in tcp_child_process+0xb42/0x1050 net/ipv4/tcp_minisocks.c:833
     __sk_rx_queue_set include/net/sock.h:1924 [inline]
     sk_rx_queue_update include/net/sock.h:1938 [inline]
     sk_mark_napi_id include/net/busy_poll.h:136 [inline]
     tcp_child_process+0xb42/0x1050 net/ipv4/tcp_minisocks.c:833
     tcp_v4_rcv+0x3d83/0x4ed0 net/ipv4/tcp_ipv4.c:2066
     ip_protocol_deliver_rcu+0x760/0x10b0 net/ipv4/ip_input.c:204
     ip_local_deliver_finish net/ipv4/ip_input.c:231 [inline]
     NF_HOOK include/linux/netfilter.h:307 [inline]
     ip_local_deliver+0x584/0x8c0 net/ipv4/ip_input.c:252
     dst_input include/net/dst.h:460 [inline]
     ip_sublist_rcv_finish net/ipv4/ip_input.c:551 [inline]
     ip_list_rcv_finish net/ipv4/ip_input.c:601 [inline]
     ip_sublist_rcv+0x11fd/0x1520 net/ipv4/ip_input.c:609
     ip_list_rcv+0x95f/0x9a0 net/ipv4/ip_input.c:644
     __netif_receive_skb_list_ptype net/core/dev.c:5505 [inline]
     __netif_receive_skb_list_core+0xe34/0x1240 net/core/dev.c:5553
     __netif_receive_skb_list+0x7fc/0x960 net/core/dev.c:5605
     netif_receive_skb_list_internal+0x868/0xde0 net/core/dev.c:5696
     gro_normal_list net/core/dev.c:5850 [inline]
     napi_complete_done+0x579/0xdd0 net/core/dev.c:6587
     virtqueue_napi_complete drivers/net/virtio_net.c:339 [inline]
     virtnet_poll+0x17b6/0x2350 drivers/net/virtio_net.c:1557
     __napi_poll+0x14e/0xbc0 net/core/dev.c:7020
     napi_poll net/core/dev.c:7087 [inline]
     net_rx_action+0x824/0x1880 net/core/dev.c:7174
     __do_softirq+0x1fe/0x7eb kernel/softirq.c:558
     run_ksoftirqd+0x33/0x50 kernel/softirq.c:920
     smpboot_thread_fn+0x616/0xbf0 kernel/smpboot.c:164
     kthread+0x721/0x850 kernel/kthread.c:327
     ret_from_fork+0x1f/0x30
    
    Uninit was created at:
     __alloc_pages+0xbc7/0x10a0 mm/page_alloc.c:5409
     alloc_pages+0x8a5/0xb80
     alloc_slab_page mm/slub.c:1810 [inline]
     allocate_slab+0x287/0x1c20 mm/slub.c:1947
     new_slab mm/slub.c:2010 [inline]
     ___slab_alloc+0xbdf/0x1e90 mm/slub.c:3039
     __slab_alloc mm/slub.c:3126 [inline]
     slab_alloc_node mm/slub.c:3217 [inline]
     slab_alloc mm/slub.c:3259 [inline]
     kmem_cache_alloc+0xbb3/0x11c0 mm/slub.c:3264
     sk_prot_alloc+0xeb/0x570 net/core/sock.c:1914
     sk_clone_lock+0xd6/0x1940 net/core/sock.c:2118
     inet_csk_clone_lock+0x8d/0x6a0 net/ipv4/inet_connection_sock.c:956
     tcp_create_openreq_child+0xb1/0x1ef0 net/ipv4/tcp_minisocks.c:453
     tcp_v4_syn_recv_sock+0x268/0x2710 net/ipv4/tcp_ipv4.c:1563
     tcp_check_req+0x207c/0x2a30 net/ipv4/tcp_minisocks.c:765
     tcp_v4_rcv+0x36f5/0x4ed0 net/ipv4/tcp_ipv4.c:2047
     ip_protocol_deliver_rcu+0x760/0x10b0 net/ipv4/ip_input.c:204
     ip_local_deliver_finish net/ipv4/ip_input.c:231 [inline]
     NF_HOOK include/linux/netfilter.h:307 [inline]
     ip_local_deliver+0x584/0x8c0 net/ipv4/ip_input.c:252
     dst_input include/net/dst.h:460 [inline]
     ip_sublist_rcv_finish net/ipv4/ip_input.c:551 [inline]
     ip_list_rcv_finish net/ipv4/ip_input.c:601 [inline]
     ip_sublist_rcv+0x11fd/0x1520 net/ipv4/ip_input.c:609
     ip_list_rcv+0x95f/0x9a0 net/ipv4/ip_input.c:644
     __netif_receive_skb_list_ptype net/core/dev.c:5505 [inline]
     __netif_receive_skb_list_core+0xe34/0x1240 net/core/dev.c:5553
     __netif_receive_skb_list+0x7fc/0x960 net/core/dev.c:5605
     netif_receive_skb_list_internal+0x868/0xde0 net/core/dev.c:5696
     gro_normal_list net/core/dev.c:5850 [inline]
     napi_complete_done+0x579/0xdd0 net/core/dev.c:6587
     virtqueue_napi_complete drivers/net/virtio_net.c:339 [inline]
     virtnet_poll+0x17b6/0x2350 drivers/net/virtio_net.c:1557
     __napi_poll+0x14e/0xbc0 net/core/dev.c:7020
     napi_poll net/core/dev.c:7087 [inline]
     net_rx_action+0x824/0x1880 net/core/dev.c:7174
     __do_softirq+0x1fe/0x7eb kernel/softirq.c:558
    
    Fixes: 342159ee ("net: avoid dirtying sk->sk_rx_queue_mapping")
    Fixes: a37a0ee4 ("net: avoid uninit-value from tcp_conn_request")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
    Tested-by: default avatarAlexander Potapenko <glider@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    03cfda4f
tcp_minisocks.c 26.6 KB