From e6a4ffd418530d901de47316c1b79ac0852ba10b Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 17 Sep 2026 00:05:42 +0300 Subject: [PATCH] reality: fix leak of ClientHello init buffer in reality_server_start_relay --- src/transport_layer/reality_relay.h | 2 +- src/transport_layer/stcp_server.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transport_layer/reality_relay.h b/src/transport_layer/reality_relay.h index 67c22eea..69ac333e 100644 --- a/src/transport_layer/reality_relay.h +++ b/src/transport_layer/reality_relay.h @@ -20,7 +20,7 @@ struct UASYNC; // Начать релей. Забирает владение client_sock (non-blocking, зарегистрирован // в uasync) и проксирует его на dest ("host:port"). // initial_data/initial_len — уже прочитанные байты от клиента (ClientHello), -// отправляются на dest первыми (буфер переходит во владение модуля). +// отправляются на dest первыми (буфер КОПИРУЕТСЯ — владение остаётся у вызывающего). // Возвращает 0 = ok, -1 = ошибка (client_sock уже закрыт внутри). int reality_relay_start(struct UASYNC *ua, socket_t client_sock, const char *dest, diff --git a/src/transport_layer/stcp_server.c b/src/transport_layer/stcp_server.c index b6a6df9b..c13e4efb 100644 --- a/src/transport_layer/stcp_server.c +++ b/src/transport_layer/stcp_server.c @@ -203,8 +203,8 @@ static void reality_server_start_relay(struct stcp_conn *c, c->socket_id = NULL; c->sock = SOCKET_INVALID; - if (reality_relay_start(c->ua, cli_sock, c->reality_dest, init, init_len) != 0) - u_free(init); + reality_relay_start(c->ua, cli_sock, c->reality_dest, init, init_len); + u_free(init); /* reality_relay_start копирует данные в свой буфер — владение остаётся у нас */ stcp_conn_do_close(c, 0); }