Bug #93 states that a connect() will hang if the remote port of a
connection setup doesn't exist. The remote host will respond with
the (RST | SYN | ACK) flags set, but we only relay the RST flag back
to the local user. This causes the situation described above.
We now add a check if the reset happens in the connection state
TAP_SYN_RCVD, in which case we add the missing (SYN | ACK) flags.
This solves the problem.
Signed-off-by: Jon Maloy
---
tcp.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tcp.c b/tcp.c
index c89f323..46df6bd 100644
--- a/tcp.c
+++ b/tcp.c
@@ -1199,9 +1199,14 @@ static int tcp_send_flag(const struct ctx *c, struct tcp_tap_conn *conn,
*/
void tcp_rst_do(const struct ctx *c, struct tcp_tap_conn *conn)
{
+ int flags = RST;
+
if (conn->events == CLOSED)
return;
+ if (conn->events == TAP_SYN_RCVD)
+ flags |= SYN | ACK;
+
if (!tcp_send_flag(c, conn, RST))
conn_event(c, conn, CLOSED);
}
--
2.48.0