mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-31 22:45:45 +00:00
Fix #972
This commit is contained in:
+18
-20
@@ -612,7 +612,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
int len = server->buf->len;
|
||||
buffer_t *buf = server->buf;
|
||||
|
||||
if (server->stage > 2) {
|
||||
if (server->stage > STAGE_PARSE) {
|
||||
remote = server->remote;
|
||||
buf = remote->buf;
|
||||
len = 0;
|
||||
@@ -652,14 +652,14 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
|
||||
tx += r;
|
||||
|
||||
if (server->stage == -1) {
|
||||
if (server->stage == STAGE_ERROR) {
|
||||
server->buf->len = 0;
|
||||
server->buf->idx = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// handle incomplete header part 1
|
||||
if (server->stage == 0) {
|
||||
if (server->stage == STAGE_INIT) {
|
||||
buf->len += r;
|
||||
if (buf->len <= enc_get_iv_len() + 1) {
|
||||
// wait for more
|
||||
@@ -679,24 +679,24 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
|
||||
// handle incomplete header part 2
|
||||
if (server->stage == 0) {
|
||||
if (server->stage == STAGE_INIT) {
|
||||
int ret = is_header_complete(server->buf);
|
||||
if (ret == 1) {
|
||||
bfree(server->header_buf);
|
||||
ss_free(server->header_buf);
|
||||
server->stage = 2;
|
||||
server->stage = STAGE_PARSE;
|
||||
} else if (ret == -1) {
|
||||
server->stage = -1;
|
||||
server->stage = STAGE_ERROR;
|
||||
report_addr(server->fd, MALFORMED);
|
||||
server->buf->len = 0;
|
||||
server->buf->idx = 0;
|
||||
return;
|
||||
} else {
|
||||
server->stage = 1;
|
||||
server->stage = STAGE_HANDSHAKE;
|
||||
}
|
||||
}
|
||||
|
||||
if (server->stage == 1) {
|
||||
if (server->stage == STAGE_HANDSHAKE) {
|
||||
size_t header_len = server->header_buf->len;
|
||||
brealloc(server->header_buf, server->buf->len + header_len, BUF_SIZE);
|
||||
memcpy(server->header_buf->array + header_len,
|
||||
@@ -711,10 +711,10 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
server->buf->len = server->header_buf->len;
|
||||
bfree(server->header_buf);
|
||||
ss_free(server->header_buf);
|
||||
server->stage = 2;
|
||||
server->stage = STAGE_PARSE;
|
||||
} else {
|
||||
if (ret == -1)
|
||||
server->stage = -1;
|
||||
server->stage = STAGE_ERROR;
|
||||
server->buf->len = 0;
|
||||
server->buf->idx = 0;
|
||||
return;
|
||||
@@ -722,7 +722,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
|
||||
// handshake and transmit data
|
||||
if (server->stage == 5) {
|
||||
if (server->stage == STAGE_STREAM) {
|
||||
if (server->auth && !ss_check_hash(remote->buf, server->chunk, server->d_ctx, BUF_SIZE)) {
|
||||
LOGE("hash error");
|
||||
report_addr(server->fd, BAD);
|
||||
@@ -749,7 +749,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_io_start(EV_A_ & remote->send_ctx->io);
|
||||
}
|
||||
return;
|
||||
} else if (server->stage == 2) {
|
||||
} else if (server->stage == STAGE_PARSE) {
|
||||
/*
|
||||
* Shadowsocks TCP Relay Header:
|
||||
*
|
||||
@@ -963,8 +963,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
server->buf->idx = 0;
|
||||
}
|
||||
|
||||
server->stage = 4;
|
||||
|
||||
// waiting on remote connected event
|
||||
ev_io_stop(EV_A_ & server_recv_ctx->io);
|
||||
ev_io_start(EV_A_ & remote->send_ctx->io);
|
||||
@@ -974,7 +972,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
query->server = server;
|
||||
snprintf(query->hostname, 256, "%s", host);
|
||||
|
||||
server->stage = 4;
|
||||
server->stage = STAGE_RESOLVE;
|
||||
server->query = resolv_query(host, server_resolve_cb,
|
||||
query_free_cb, query, port);
|
||||
|
||||
@@ -1060,7 +1058,7 @@ server_timeout_cb(EV_P_ ev_timer *watcher, int revents)
|
||||
LOGI("TCP connection timeout");
|
||||
}
|
||||
|
||||
if (server->stage < 2) {
|
||||
if (server->stage < STAGE_PARSE) {
|
||||
if (verbose) {
|
||||
size_t len = server->stage ?
|
||||
server->header_buf->len : server->buf->len;
|
||||
@@ -1244,7 +1242,7 @@ remote_send_cb(EV_P_ ev_io *w, int revents)
|
||||
reset_addr(server->fd);
|
||||
|
||||
if (remote->buf->len == 0) {
|
||||
server->stage = 5;
|
||||
server->stage = STAGE_STREAM;
|
||||
ev_io_stop(EV_A_ & remote_send_ctx->io);
|
||||
ev_io_start(EV_A_ & server->recv_ctx->io);
|
||||
ev_io_start(EV_A_ & remote->recv_ctx->io);
|
||||
@@ -1291,8 +1289,8 @@ remote_send_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_io_stop(EV_A_ & remote_send_ctx->io);
|
||||
if (server != NULL) {
|
||||
ev_io_start(EV_A_ & server->recv_ctx->io);
|
||||
if (server->stage == 4) {
|
||||
server->stage = 5;
|
||||
if (server->stage != STAGE_STREAM) {
|
||||
server->stage = STAGE_STREAM;
|
||||
ev_io_start(EV_A_ & remote->recv_ctx->io);
|
||||
}
|
||||
} else {
|
||||
@@ -1384,7 +1382,7 @@ new_server(int fd, listen_ctx_t *listener)
|
||||
server->recv_ctx->connected = 0;
|
||||
server->send_ctx->server = server;
|
||||
server->send_ctx->connected = 0;
|
||||
server->stage = 0;
|
||||
server->stage = STAGE_INIT;
|
||||
server->query = NULL;
|
||||
server->listen_ctx = listener;
|
||||
server->remote = NULL;
|
||||
|
||||
Reference in New Issue
Block a user