Correct STCP close contracts and sanitizer issues in its test

This commit is contained in:
evgeny committed 2026-10-23 22:01:48 +02:00
1 parent 477d8f995b
commit bf5a128a05
2 files changed
+12 -4

No files matched your search

+5 -1
View File
@@ -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)
+7 -3
View File
@@ -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);