Changelog in Linux kernel 6.6.159

 
ipv4: free inet_opt and ireq_opt after an RCU grace period [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Thu Oct 1 22:12:53 2026 +0000

    ipv4: free inet_opt and ireq_opt after an RCU grace period
    
    commit e3f33b0a1d89d738e2b913dab519226eaf76e15b upstream.
    
    tcp_v4_syn_recv_sock() transfers ownership of ireq->ireq_opt to the
    child socket (newinet->inet_opt) without copying it.
    
    Another cpu can concurrently process a retransmitted SYN for the same
    request socket, and send a SYNACK from tcp_check_req().
    tcp_v4_send_synack() and inet_csk_route_req() read ireq->ireq_opt
    under rcu_read_lock() only, and ip_build_and_send_pkt() and
    ip_options_build() then read opt->optlen twice.
    
    Note that the SYNACK timer itself is not an issue: it holds a
    reference on its request socket, and inet_csk_reqsk_queue_drop()
    calls timer_delete_sync() before the child can be freed.
    
    Since commit 079096f103fa ("tcp/dccp: install syn_recv requests
    into ehash table"), request sockets are processed without holding
    the listener lock, so nothing prevents the child socket from being
    freed while the SYNACK is still being built. TCP child sockets do
    not have SOCK_RCU_FREE, and inet_sock_destruct() frees inet_opt
    with a plain kfree(), leading to a use-after-free in
    ip_options_build().
    
    A similar issue exists with request socket migration
    (net.ipv4.tcp_migrate_req=1, or a BPF_SK_REUSEPORT_SELECT_OR_MIGRATE
    program). reqsk_timer_handler() clones the request socket with
    inet_reqsk_clone(), so that the old request socket and its clone
    share the same ireq_opt, then reqsk_migrate_reset() clears the
    pointer in the old one. Another cpu holding a reference on the old
    request socket can still be using these options (sending a SYNACK,
    or creating a child in tcp_v4_syn_recv_sock()) when the clone is
    freed, and tcp_v4_reqsk_destructor() also uses a plain kfree().
    
    Readers already use RCU, and other paths replacing inet_opt
    (do_ip_setsockopt(), cipso_v4_sock_setattr()...) already use
    kfree_rcu(). Use kfree_rcu() in inet_sock_destruct() and
    tcp_v4_reqsk_destructor() as well.
    
    IPv6 is not affected by the first issue, because tcp_v6_syn_recv_sock()
    duplicates the options. tcp_v6_reqsk_destructor() has the same
    migration issue with ipv6_opt, which is only set by CALIPSO. This
    will be addressed in a separate patch.
    
    Fixes: 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table")
    Fixes: c905dee62232 ("tcp: Migrate TCP_NEW_SYN_RECV requests at retransmitting SYN+ACKs.")
    Reported-by: Xinyang Ge <[email protected]>
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: validate checksum_start before completing checksum [+ + +]
Author: Michael S. Tsirkin <[email protected]>
Date:   Wed Oct 7 18:42:49 2026 -0400

    ipv4: validate checksum_start before completing checksum
    
    commit 6785011f8b16abf40b1e9d8b2e332232b3e68822 upstream.
    
    If a packet with bad checksum metadata gets into the ipv4 stack,
    skb_checksum_help can corrupt the network header and cause a bunch of
    mischief.
    
    This was discovered and reported by Paulos, and has been reporoduced
    by others independently since.
    
    We really shouldn't allow such packets in, but as a defence
    in depth measure, let's also check before we complete the checksum.
    
    A more complete validation at input is forthcoming, but needs more work.
    
    Cc: [email protected]
    Fixes: f43798c27684 ("tun: Allow GSO using virtio_net_hdr")
    Fixes: bfd5f4a3d605 ("packet: Add GSO/csum offload support.")
    Reported-by: Paulos Yibelo <[email protected]>
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Signed-off-by: Michael S. Tsirkin <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/0a012b4923e189c4c593ef4f471e5ff0edbe9030.1791412497.git.mst@redhat.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Linux: Linux 6.6.159 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Thu Oct 15 14:16:28 2026 +0200

    Linux 6.6.159
    
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
netfilter: nfnetlink_queue: unbreak SCTP traffic [+ + +]
Author: Antonio Ojea <[email protected]>
Date:   Thu Jun 27 13:27:10 2024 +0200

    netfilter: nfnetlink_queue: unbreak SCTP traffic
    
    commit 26a77d02891ab62172085a4f94af9b3c90aed387 upstream.
    
    when packet is enqueued with nfqueue and GSO is enabled, checksum
    calculation has to take into account the protocol, as SCTP uses a
    32 bits CRC checksum.
    
    Enter skb_gso_segment() path in case of SCTP GSO packets because
    skb_zerocopy() does not support for GSO_BY_FRAGS.
    
    Joint work with Pablo.
    
    Signed-off-by: Antonio Ojea <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>