mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-20 13:03:50 +00:00
fix a bug in ss-tunnel
This commit is contained in:
+2
-6
@@ -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);
|
||||
|
||||
+12
-33
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user