From 7c09bfca7f733c696477166bf1c416fcba95dd2d Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 19:26:00 +0200 Subject: [PATCH] Stop packet construction when input callbacks restart the stream --- src/transport_layer/etcp.c | 2 ++ tests/test_etcp_windows.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index f0b3298b..21a27dbe 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -1015,6 +1015,8 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* conn) { return NULL; } if (!conn->input_send_q->head) input_queue_try_push(conn); + // Callback input_queue мог сменить эпоху при исчерпании seq или OOM; старый проход отправки прекращается. + if (conn->close_requested || conn->state == 2 || !conn->initialized || conn->session_required || conn->reinit_pending) return NULL; struct INFLIGHT_PACKET* packet = (struct INFLIGHT_PACKET*)conn->input_send_q->head; struct ETCP_LINK* link = NULL; for (struct ETCP_LINK* candidate = conn->links; candidate; candidate = candidate->next) diff --git a/tests/test_etcp_windows.c b/tests/test_etcp_windows.c index 2e540914..b3cef271 100644 --- a/tests/test_etcp_windows.c +++ b/tests/test_etcp_windows.c @@ -1075,6 +1075,8 @@ static void compact_sequence_exhaustion(void) { memory_pool_free(inst.pkt_pool,pkt); uint64_t epoch = conn->reset_id; CHECK(etcp_int_send(conn,normalized,sizeof(normalized)) == 0); + CHECK(conn->input_queue->count == 1); a->burst_active = 1; + CHECK(!request()); // input_queue callback выполняется при следующем проходе отправителя. CHECK(conn->reset_id != epoch && conn->reinit_pending && conn->session_required && conn->next_tx_id == 1); CHECK(!conn->active_attempts && !conn->unacked_bytes && !conn->input_queue->count); confirm_test_session(); teardown();