mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-21 22:43:48 +00:00
Fix #673
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
+2
-2
@@ -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));
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+5
-5
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user