Re: [PATCH net] tcp: reject devmem tx with fastopen and repair
flat view
From: Stanislav Fomichev <hidden>
Date: 2026-10-06 22:16:40
Also in:
lkml
On 10/05, Kaifeng Wang wrote:
tcp_sendmsg_locked() enforces that devmem TX can only proceed if the
zero-copy path is active and a valid dmabuf binding exists. However,
subsequent branches in tcp_sendmsg_locked() can still intercept the
message before it reaches the devmem zero-copy loop:
1. TCP Fast Open (MSG_FASTOPEN or DEFER_CONNECT):
If TCP_FASTOPEN_CONNECT is set, the socket may have a valid dst with
NETIF_F_SG (so zc == MSG_ZEROCOPY and binding is present), but
tcp_sendmsg_fastopen() -> tcp_send_syn_data() will use
copy_page_from_iter() to byte-copy from the iterator. Since iov_base
represents dma-buf offsets rather than user virtual addresses, this
misinterprets offsets as user pointers and copies arbitrary user memory
into the SYN packet.
2. TCP repair mode:
If tp->repair is enabled with TCP_RECV_QUEUE, tcp_send_rcvq() similarly
calls skb_copy_datagram_from_iter(), byte-copying from the iterator.
Neither path supports or makes sense for devmem transmission. Reject devmem
sends if Fast Open or repair mode is active.
This pre-existing issue was identified by Sashiko AI review on commit
125755776bc6 ("tcp: reject non zerocopy devmem tx") and has not been
hit in production.Flagged by an AI review: we do tp->repair check before sk_stream_wait_connect which drops/requires the socket lock. So technically someone can setsockopt(tcp_repair) which the connection handshake is happening. Sounds reasonable?