From 4658b57c3e57c0724acee8d001b189a0badc7705 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 12 Nov 2025 17:20:24 -0300 Subject: [PATCH] tcp: fix receival of resets --- kernel-src/io/net/tcp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel-src/io/net/tcp.c b/kernel-src/io/net/tcp.c index ee47c38a..433b29fa 100644 --- a/kernel-src/io/net/tcp.c +++ b/kernel-src/io/net/tcp.c @@ -908,13 +908,18 @@ __attribute__((noreturn)) static void tcp_worker() { continue; } - if (seqinrange(tcpheader->seq, tcpheader->seq + 1, tcb->rcvnext, tcb->rcvnext + tcb->rcvwindow) && (tcpheader->control & CONTROL_RST) && tcb->state != TCB_STATE_LISTEN) { + // resets have different requirements based on the state of the connection. + // if the state is not *syn sent*, it must fall within the window to bee accepted + if ((tcpheader->control & CONTROL_RST) && tcb->state != TCB_STATE_LISTEN && ( + (tcb->state == TCB_STATE_SYNSENT) || + (seqinrange(tcpheader->seq, tcpheader->seq + 1, tcb->rcvnext, tcb->rcvnext + tcb->rcvwindow)))) { tcp_reset(tcb); MUTEX_RELEASE(&tcb->mutex); TCB_RELEASE(tcb); continue; } + switch (tcb->state) { case TCB_STATE_LISTEN: { // (listening socket only)