diff --git a/src/transport_layer/stcp.h b/src/transport_layer/stcp.h index ddf0f0d6..a7dd5d31 100644 --- a/src/transport_layer/stcp.h +++ b/src/transport_layer/stcp.h @@ -194,8 +194,12 @@ void stcp_recv_set(struct stcp_conn *c, size_t need, int streaming, // try to process buffered data according to recv_need/streaming/on_chunk void stcp_recv_try(struct stcp_conn *c); -// unified close: closes socket, frees buffers, calls on_close. does NOT clean streams (stcp_conn_free does) +/* Мягкое закрытие: запрещает RX, досылает накопленный TX и REALITY close_notify. + * Завершение или таймаут 1 с вызывают do_close. Не освобождает внешние RX/TX очереди. */ void stcp_conn_finish(struct stcp_conn *c); +/* Немедленно закрывает сокет, отменяет таймеры, освобождает wire/recv/send буферы и потоки шифрования. + * on_close вызывается один раз; повторное закрытие игнорируется. Внешние RX/TX очереди остаются у владельца. + * Серверный allocated conn и free_on_close освобождаются отложенно; клиентский conn встроен в client handle. */ void stcp_conn_do_close(struct stcp_conn *c, int err); // снимает принятый коннект из списка владеющего сервера (реализация в stcp_server.c) diff --git a/tests/test_stcp.c b/tests/test_stcp.c index 6ec4c9fd..64456b3d 100644 --- a/tests/test_stcp.c +++ b/tests/test_stcp.c @@ -125,7 +125,7 @@ ssize_t __wrap_send(socket_t sock, const void* buf, size_t len, int flags) { #define TRUN(name) do { \ tests_total++; \ - DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "--- %s ---", name); \ + DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "--- %s ---", #name); \ int _r = name(); \ if (_r == 0) { tests_passed++; DEBUG_INFO(DEBUG_CATEGORY_GENERAL, " PASS"); } \ } while(0) @@ -146,8 +146,12 @@ static void peer_rx_cb(struct ll_queue *q, void *arg) { if (!e) { queue_resume_callback(q); return; } p->msg_count++; size_t need = p->accum_len + e->len; - if (need > p->accum_cap) { p->accum_cap = need + 4096; p->accum = u_realloc(p->accum, p->accum_cap); } - memcpy(p->accum + p->accum_len, e->dgram, e->len); + if (need > p->accum_cap) { + p->accum_cap = need + 4096; + p->accum = u_realloc(p->accum, p->accum_cap); + if (!p->accum) { DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "test receive buffer allocation failed size=%zu", p->accum_cap); abort(); } + } + if (e->len) memcpy(p->accum + p->accum_len, e->dgram, e->len); p->accum_len += e->len; queue_dgram_free(e); queue_entry_free(e);