From 658703a1bda0bdebc206ef79ff55eba68a943f72 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 12 Jun 2016 09:09:03 +0800 Subject: [PATCH] Fix #673 --- src/acl.c | 4 ++-- src/android.c | 4 ++-- src/local.c | 2 +- src/server.c | 25 +++++++++++++++++++------ src/server.h | 5 +++++ src/udprelay.c | 10 +++++----- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/acl.c b/src/acl.c index 9e46a15d..a19a5292 100644 --- a/src/acl.c +++ b/src/acl.c @@ -66,7 +66,7 @@ int init_acl(const char *path, int mode) return -1; } - char line[256]; + char line[257]; while (!feof(f)) if (fgets(line, 256, f)) { // Trim the newline @@ -75,7 +75,7 @@ int init_acl(const char *path, int mode) line[len - 1] = '\0'; } - char host[256]; + char host[257]; int cidr; parse_addr_cidr(line, host, &cidr); diff --git a/src/android.c b/src/android.c index 899d9149..ccd2073e 100644 --- a/src/android.c +++ b/src/android.c @@ -64,7 +64,7 @@ int protect_socket(int fd) setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); - char path[256]; + char path[257]; sprintf(path, "%s/protect_path", prefix); memset(&addr, 0, sizeof(addr)); @@ -113,7 +113,7 @@ int send_traffic_stat(uint64_t tx, uint64_t rx) setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); - char path[256]; + char path[257]; sprintf(path, "%s/stat_path", prefix); memset(&addr, 0, sizeof(addr)); diff --git a/src/local.c b/src/local.c index 66dfe05c..71942909 100644 --- a/src/local.c +++ b/src/local.c @@ -418,7 +418,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) close_and_free_server(EV_A_ server); return; } else { - char host[256], port[16]; + char host[257], port[16]; buffer_t ss_addr_to_send; buffer_t *abuf = &ss_addr_to_send; diff --git a/src/server.c b/src/server.c index 2cb2ae2b..f9097a28 100644 --- a/src/server.c +++ b/src/server.c @@ -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; diff --git a/src/server.h b/src/server.h index 6775a009..12aa9d79 100644 --- a/src/server.h +++ b/src/server.h @@ -69,6 +69,11 @@ typedef struct server { struct cork_dllist_item entries; } server_t; +typedef struct query { + server_t *server; + char hostname[257]; +} query_t; + typedef struct remote_ctx { ev_io io; int connected; diff --git a/src/udprelay.c b/src/udprelay.c index d1f61a28..2c498e6a 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -240,7 +240,7 @@ static int parse_udprealy_header(const char *buf, const size_t buf_len, uint8_t name_len = *(uint8_t *)(buf + offset); if (name_len + 4 <= buf_len) { if (storage != NULL) { - char tmp[256] = { 0 }; + char tmp[257] = { 0 }; struct cork_ip ip; memcpy(tmp, buf + offset + 1, name_len); if (cork_ip_init(&ip, tmp) != -1) { @@ -710,7 +710,7 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) rx += buf->len; - char addr_header_buf[256]; + char addr_header_buf[512]; char *addr_header = remote_ctx->addr_header; int addr_header_len = remote_ctx->addr_header_len; @@ -915,7 +915,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) */ #ifdef MODULE_REDIR - char addr_header[256] = { 0 }; + char addr_header[512] = { 0 }; int addr_header_len = construct_udprealy_header(&dst_addr, addr_header); if (addr_header_len == 0) { @@ -931,7 +931,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) #elif MODULE_TUNNEL - char addr_header[256] = { 0 }; + char addr_header[512] = { 0 }; char *host = server_ctx->tunnel_addr.host; char *port = server_ctx->tunnel_addr.port; uint16_t port_num = (uint16_t)atoi(port); @@ -985,7 +985,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) #else - char host[256] = { 0 }; + char host[257] = { 0 }; char port[64] = { 0 }; struct sockaddr_storage dst_addr; memset(&dst_addr, 0, sizeof(struct sockaddr_storage));