diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2025-02-27 16:55:16 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-02-28 01:32:36 +0100 |
commit | b2708218a6eec82fad98da52d7569d13cf35e05c (patch) | |
tree | 6e6ec2f7b15912f574a7134b6ab671634ad7a714 | |
parent | 56ce03ed0acf2a41c67d44e353c00a018604ccb7 (diff) | |
download | passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar.gz passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar.bz2 passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar.lz passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar.xz passt-b2708218a6eec82fad98da52d7569d13cf35e05c.tar.zst passt-b2708218a6eec82fad98da52d7569d13cf35e05c.zip |
tcp: Unconditionally move to CLOSED state on tcp_rst()
tcp_rst() attempts to send an RST packet to the guest, and if that succeeds
moves the flow to CLOSED state. However, even if the tcp_send_flag() fails
the flow is still dead: we've usually closed the socket already, and
something has already gone irretrievably wrong. So we should still mark
the flow as CLOSED. That will cause it to be cleaned up, meaning any
future packets from the guest for it won't match a flow, so should generate
new RSTs (they don't at the moment, but that's a separate bug).
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | tcp.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -1214,8 +1214,8 @@ void tcp_rst_do(const struct ctx *c, struct tcp_tap_conn *conn) if (conn->events == CLOSED) return; - if (!tcp_send_flag(c, conn, RST)) - conn_event(c, conn, CLOSED); + tcp_send_flag(c, conn, RST); + conn_event(c, conn, CLOSED); } /** |