aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-09-08 11:49:51 +1000
committerStefano Brivio <sbrivio@redhat.com>2023-09-08 09:16:17 +0200
commitf984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0 (patch)
treebefadbc2189c4ab0dd465604c35504b56da57c74
parent60d3915ea3b07ac0a02aaf73dbf3d99547ff33bc (diff)
downloadpasst-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar.gz
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar.bz2
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar.lz
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar.xz
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.tar.zst
passt-f984003fdf2cc2dbd0ac55a47d9a4a25776fc2d0.zip
tcp: Correctly handle RST followed rapidly by SYN
Although it's unlikely in practice, the guest could theoretically reset one TCP connection then immediately start a new one with the same addressses and ports, such that we get an RST then a SYN in the same batch of received packets in tcp_tap_handler(). We don't correctly handle that unlikely case, because when we receive the RST, we discard any remaining packets in the batch so we'd never see the SYN. This could happen in either tcp_tap_handler() or tcp_data_from_tap(). Correct that by returning 1, so that the caller will continue calling tcp_tap_handler() on subsequent packets allowing us to process any subsequent SYN. 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 34c27f0..a1b5a72 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2337,7 +2337,7 @@ static int tcp_data_from_tap(struct ctx *c, struct tcp_tap_conn *conn,
if (th->rst) {
conn_event(c, conn, CLOSED);
- return p->count - idx;
+ return 1;
}
len -= off;
@@ -2570,7 +2570,7 @@ int tcp_tap_handler(struct ctx *c, int af, const void *saddr, const void *daddr,
if (th->rst) {
conn_event(c, conn, CLOSED);
- return p->count - idx;
+ return 1;
}
if (th->ack && !(conn->events & ESTABLISHED))