Browse Source

Fix #673

pull/677/head
Max Lv 9 years ago
parent
commit
658703a1bd
6 changed files with 34 additions and 16 deletions
  1. 4
      src/acl.c
  2. 4
      src/android.c
  3. 2
      src/local.c
  4. 25
      src/server.c
  5. 5
      src/server.h
  6. 10
      src/udprelay.c

4
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);

4
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));

2
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;

25
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;

5
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;

10
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));

Loading…
Cancel
Save