[PATCH] Fix segfault on TCP connection before first passt socket connection
This issue can be reproduced by running passt with TCP forwarding and connecting to that TCP port before the first client (e.g. QEMU) connects to the passt socket. Example: (sleep 0.1; ssh -p 22000 127.0.0.1) & passt -f -t 22000:22 Although this commit likely doesn't fix the root cause of this issue, it does reliably fix the segfault. --- tcp_buf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tcp_buf.c b/tcp_buf.c index bc898de..1a06f15 100644 --- a/tcp_buf.c +++ b/tcp_buf.c @@ -120,6 +120,9 @@ static void tcp_revert_seq(const struct ctx *c, struct tcp_tap_conn **conns, uint32_t seq = ntohl(th->seq); uint32_t peek_offset; + if (conn == NULL) + continue; + if (SEQ_LE(conn->seq_to_tap, seq)) continue; -- 2.47.3
On Tue, Sep 09, 2025 at 05:04:12PM +0200, Volker Diels-Grabsch wrote:
This issue can be reproduced by running passt with TCP forwarding and connecting to that TCP port before the first client (e.g. QEMU) connects to the passt socket. Example:
(sleep 0.1; ssh -p 22000 127.0.0.1) & passt -f -t 22000:22
Although this commit likely doesn't fix the root cause of this issue, it does reliably fix the segfault.
Right, this band-aids the problem, but isn't the correct fix. Getting a NULL pointer here indicates that we're putting a frame into the queue without setting the corresponding tcp_frame_conns[] entry, which is definitely wrong. Thanks for the reproducer, I'm having a look into this now.
--- tcp_buf.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/tcp_buf.c b/tcp_buf.c index bc898de..1a06f15 100644 --- a/tcp_buf.c +++ b/tcp_buf.c @@ -120,6 +120,9 @@ static void tcp_revert_seq(const struct ctx *c, struct tcp_tap_conn **conns, uint32_t seq = ntohl(th->seq); uint32_t peek_offset;
+ if (conn == NULL) + continue; + if (SEQ_LE(conn->seq_to_tap, seq)) continue;
-- 2.47.3
-- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson
participants (2)
-
David Gibson
-
Volker Diels-Grabsch