mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-31 06:23:52 +00:00
Fix #673
This commit is contained in:
+19
-6
@@ -104,6 +104,7 @@ static void close_and_free_remote(EV_P_ remote_t *remote);
|
||||
static void free_server(server_t *server);
|
||||
static void close_and_free_server(EV_P_ server_t *server);
|
||||
static void server_resolve_cb(struct sockaddr *addr, void *data);
|
||||
static void query_free_cb(void *data);
|
||||
|
||||
static size_t parse_header_len(const char atyp, const char *data, size_t offset);
|
||||
|
||||
@@ -625,7 +626,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
int offset = 0;
|
||||
int need_query = 0;
|
||||
char atyp = server->buf->array[offset++];
|
||||
char host[256] = { 0 };
|
||||
char host[257] = { 0 };
|
||||
uint16_t port = 0;
|
||||
struct addrinfo info;
|
||||
struct sockaddr_storage storage;
|
||||
@@ -816,9 +817,13 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
query_t *query = (query_t *)ss_malloc(sizeof(query_t));
|
||||
query->server = server;
|
||||
snprintf(query->hostname, 256, "%s", host);
|
||||
|
||||
server->stage = 4;
|
||||
server->query = resolv_query(host, server_resolve_cb, NULL, server,
|
||||
port);
|
||||
server->query = resolv_query(host, server_resolve_cb,
|
||||
query_free_cb, query, port);
|
||||
|
||||
ev_io_stop(EV_A_ & server_recv_ctx->io);
|
||||
}
|
||||
@@ -898,19 +903,27 @@ static void server_timeout_cb(EV_P_ ev_timer *watcher, int revents)
|
||||
close_and_free_server(EV_A_ server);
|
||||
}
|
||||
|
||||
static void query_free_cb(void *data)
|
||||
{
|
||||
if (data != NULL) {
|
||||
ss_free(data);
|
||||
}
|
||||
}
|
||||
|
||||
static void server_resolve_cb(struct sockaddr *addr, void *data)
|
||||
{
|
||||
server_t *server = (server_t *)data;
|
||||
query_t *query = (query_t *)data;
|
||||
server_t *server = query->server;
|
||||
struct ev_loop *loop = server->listen_ctx->loop;
|
||||
|
||||
server->query = NULL;
|
||||
|
||||
if (addr == NULL) {
|
||||
LOGE("unable to resolve");
|
||||
LOGE("unable to resolve %s", query->hostname);
|
||||
close_and_free_server(EV_A_ server);
|
||||
} else {
|
||||
if (verbose) {
|
||||
LOGI("udns resolved");
|
||||
LOGI("successfully resolved %s", query->hostname);
|
||||
}
|
||||
|
||||
struct addrinfo info;
|
||||
|
||||
Reference in New Issue
Block a user