tcp_io: fix error_cb busy-spin on graceful EPOLLHUP; socks_proxy: close local socket on both FINs
- error_cb (tcp_io): при graceful HUP (SO_ERROR==0) после уже прочитанного FIN сокет оставался в epoll и level-triggered EPOLLHUP крутил цикл на 100% CPU. Теперь сокет закрывается через tcp_conn_push_close. - socks_proxy on_fin_cb: при обоих обменянных FIN локальный сокет закрывается (send_close + push_close), симметрично exit-стороне (tcp_proxy_server).
This commit is contained in:
1 parent
56d0928632
commit
ce12f058d9
3 files changed
+23
-2
No files matched your search
@@ -525,7 +525,15 @@ static void on_fin_cb(struct tcp_conn* tc, void* arg) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_PROXY, "socks_proxy: local FIN deferred (tx_buf pending) sid=%08x", c->stream_id);
|
||||
return;
|
||||
}
|
||||
if (!tc->fin_local && !tc->write_buf && !tc->write_queue->head) {
|
||||
if (tc->fin_local) {
|
||||
// оба FIN обменяны: мы уже shutdown-нули свой write (fin_local), peer прислал FIN.
|
||||
// Закрываем локальный сокет, симметрично exit-стороне (tcp_proxy_server.c on_fin_cb).
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_PROXY, "socks_proxy: both FINs done → close local socket sid=%08x", c->stream_id);
|
||||
send_close(c);
|
||||
tcp_conn_push_close(tc);
|
||||
return;
|
||||
}
|
||||
if (!tc->write_buf && !tc->write_queue->head) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_PROXY, "socks_proxy: local FIN → relay FIN sid=%08x", c->stream_id);
|
||||
send_fin(c);
|
||||
if (c->fin_remote && !c->close_sent && !c->close_pending) send_close(c);
|
||||
|
||||
Reference in new issue
Block a user