aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2025-02-27 16:55:16 +1100
committerStefano Brivio <sbrivio@redhat.com>2025-02-28 01:32:36 +0100
commitb2708218a6eec82fad98da52d7569d13cf35e05c (patch)
tree6e6ec2f7b15912f574a7134b6ab671634ad7a714
parent56ce03ed0acf2a41c67d44e353c00a018604ccb7 (diff)
downloadpasst-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.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/tcp.c b/tcp.c
index 8528ee3..d23b6d9 100644
--- a/tcp.c
+++ b/tcp.c
@@ -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);
}
/**