diff --git a/src/redir.c b/src/redir.c index 3e6429dc6..c18f0a202 100644 --- a/src/redir.c +++ b/src/redir.c @@ -163,8 +163,6 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) if (r == 0) { // connection closed - remote->buf_len = 0; - remote->buf_idx = 0; close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); return; @@ -274,8 +272,6 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) if (r == 0) { // connection closed - server->buf_len = 0; - server->buf_idx = 0; close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); return; @@ -715,10 +711,10 @@ int main(int argc, char **argv) int listenfd; listenfd = create_and_bind(local_addr, local_port); if (listenfd < 0) { - FATAL("bind() error.."); + FATAL("bind() error"); } if (listen(listenfd, SOMAXCONN) == -1) { - FATAL("listen() error."); + FATAL("listen() error"); } setnonblocking(listenfd); LOGI("server listening at port %s", local_port); diff --git a/src/tunnel.c b/src/tunnel.c index bfcfe9d6f..0e301fa1c 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -175,12 +175,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) if (r == 0) { // connection closed - remote->buf_len = 0; - remote->buf_idx = 0; + close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); - if (remote != NULL) { - ev_io_start(EV_A_ & remote->send_ctx->io); - } return; } else if (r < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { @@ -285,10 +281,6 @@ static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) ev_timer_stop(EV_A_ watcher); - if (server == NULL) { - close_and_free_remote(EV_A_ remote); - return; - } close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); } @@ -298,21 +290,13 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) struct remote_ctx *remote_recv_ctx = (struct remote_ctx *)w; struct remote *remote = remote_recv_ctx->remote; struct server *server = remote->server; - if (server == NULL) { - close_and_free_remote(EV_A_ remote); - return; - } ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0); if (r == 0) { // connection closed - server->buf_len = 0; - server->buf_idx = 0; close_and_free_remote(EV_A_ remote); - if (server != NULL) { - ev_io_start(EV_A_ & server->send_ctx->io); - } + close_and_free_server(EV_A_ server); return; } else if (r < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { @@ -388,7 +372,7 @@ static void remote_send_cb(EV_P_ ev_io *w, int revents) int host_len = sizeof(struct in_addr); if (dns_pton(AF_INET, sa->host, &host) == -1) { - FATAL("IP parser error."); + FATAL("IP parser error"); } ss_addr_to_send[addr_len++] = 1; memcpy(ss_addr_to_send + addr_len, &host, host_len); @@ -399,13 +383,13 @@ static void remote_send_cb(EV_P_ ev_io *w, int revents) int host_len = sizeof(struct in6_addr); if (dns_pton(AF_INET6, sa->host, &host) == -1) { - FATAL("IP parser error."); + FATAL("IP parser error"); } ss_addr_to_send[addr_len++] = 4; memcpy(ss_addr_to_send + addr_len, &host, host_len); addr_len += host_len; } else { - FATAL("IP parser error."); + FATAL("IP parser error"); } } else { // send as domain @@ -434,9 +418,10 @@ static void remote_send_cb(EV_P_ ev_io *w, int revents) free(ss_addr_to_send); if (s < addr_len) { - LOGE("failed to send remote addr."); + LOGE("failed to send addr"); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); + return; } ev_io_start(EV_A_ & remote->recv_ctx->io); @@ -478,13 +463,7 @@ static void remote_send_cb(EV_P_ ev_io *w, int revents) remote->buf_len = 0; remote->buf_idx = 0; ev_io_stop(EV_A_ & remote_send_ctx->io); - if (server != NULL) { - ev_io_start(EV_A_ & server->recv_ctx->io); - } else { - close_and_free_remote(EV_A_ remote); - close_and_free_server(EV_A_ server); - return; - } + ev_io_start(EV_A_ & server->recv_ctx->io); } } @@ -778,7 +757,7 @@ int main(int argc, char **argv) parse_addr(tunnel_addr_str, &tunnel_addr); if (tunnel_addr.port == NULL) { - FATAL("tunnel port is not defined."); + FATAL("tunnel port is not defined"); } #ifdef __MINGW32__ @@ -797,13 +776,13 @@ int main(int argc, char **argv) int listenfd; listenfd = create_and_bind(local_addr, local_port); if (listenfd < 0) { - FATAL("bind() error.."); + FATAL("bind() error:"); } if (listen(listenfd, SOMAXCONN) == -1) { - FATAL("listen() error."); + FATAL("listen() error:"); } setnonblocking(listenfd); - LOGI("server listening at port %s.", local_port); + LOGI("server listening at port %s", local_port); // Setup proxy context struct listen_ctx listen_ctx;