Correct STCP close contracts and sanitizer issues in its test
This commit is contained in:
1 parent
477d8f995b
commit
bf5a128a05
2 files changed
+12
-4
No files matched your search
@@ -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
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user