Skip to content

Commit 1fcd608

Browse files
committed
fix #121
1 parent 6040c0c commit 1fcd608

File tree

2 files changed

+61
-43
lines changed

2 files changed

+61
-43
lines changed

src/udprelay.c

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,17 @@ static int setinterface(int socket_fd, const char* interface_name)
9696
}
9797
#endif
9898

99-
static char *hash_key(const char *header, const int header_len, const struct sockaddr *addr)
99+
static char *hash_key(const char *header, const int header_len, const struct sockaddr_storage *addr)
100100
{
101101
char key[384];
102102

103103
// calculate hash key
104104
// assert header_len < 256
105105
memset(key, 0, 384);
106-
memcpy(key, addr, sizeof(struct sockaddr));
107-
memcpy(key + sizeof(struct sockaddr), header, header_len);
106+
memcpy(key, addr, sizeof(struct sockaddr_storage));
107+
memcpy(key + sizeof(struct sockaddr_storage), header, header_len);
108108

109-
return (char*) enc_md5((const uint8_t *)key, sizeof(struct sockaddr) + header_len, NULL);
109+
return (char*) enc_md5((const uint8_t *)key, sizeof(struct sockaddr_storage) + header_len, NULL);
110110
}
111111

112112
static int parse_udprealy_header(const char* buf, const int buf_len, char *host, char *port)
@@ -218,39 +218,45 @@ int create_remote_socket(int ipv6)
218218
{
219219
// Try to bind IPv6 first
220220
struct sockaddr_in6 addr;
221-
memset(&addr, 0, sizeof(struct sockaddr_in6));
221+
memset(&addr, 0, sizeof(addr));
222+
addr.sin6_len = sizeof(addr);
222223
addr.sin6_family = AF_INET6;
223224
addr.sin6_addr = in6addr_any;
224-
addr.sin6_port = htons(0);
225+
addr.sin6_port = 0;
225226
remote_sock = socket(AF_INET6, SOCK_DGRAM , 0);
226-
if (remote_sock != -1)
227+
if (remote_sock == -1)
227228
{
228-
if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != -1)
229-
{
230-
return remote_sock;
231-
}
229+
ERROR("Cannot create socket.");
230+
return -1;
231+
}
232+
if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
233+
{
234+
FATAL("Cannot bind remote.");
235+
return -1;
232236
}
233237
}
234-
235-
// Then bind to IPv4
236-
struct sockaddr_in addr;
237-
memset(&addr, 0, sizeof(addr));
238-
addr.sin_family = AF_INET;
239-
addr.sin_addr.s_addr = htonl(INADDR_ANY);
240-
addr.sin_port = htons(0);
241-
remote_sock = socket(AF_INET, SOCK_DGRAM , 0);
242-
if (remote_sock == -1)
238+
else
243239
{
244-
ERROR("Cannot create socket.");
245-
return -1;
246-
}
240+
// Or else bind to IPv4
241+
struct sockaddr_in addr;
242+
memset(&addr, 0, sizeof(addr));
243+
addr.sin_len = sizeof(addr);
244+
addr.sin_family = AF_INET;
245+
addr.sin_addr.s_addr = INADDR_ANY;
246+
addr.sin_port = 0;
247+
remote_sock = socket(AF_INET, SOCK_DGRAM , 0);
248+
if (remote_sock == -1)
249+
{
250+
ERROR("Cannot create socket.");
251+
return -1;
252+
}
247253

248-
if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
249-
{
250-
FATAL("Cannot bind remote.");
251-
return -1;
254+
if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
255+
{
256+
FATAL("Cannot bind remote.");
257+
return -1;
258+
}
252259
}
253-
254260
return remote_sock;
255261
}
256262

@@ -451,7 +457,7 @@ static void query_resolve_cb(EV_P_ ev_io *w, int revents)
451457

452458
struct remote_ctx *remote_ctx = new_remote(remotefd, query_ctx->server_ctx);
453459
remote_ctx->src_addr = query_ctx->src_addr;
454-
remote_ctx->dst_addr = *rp->ai_addr;
460+
remote_ctx->dst_addr = *((struct sockaddr_storage *)rp->ai_addr);
455461
remote_ctx->server_ctx = query_ctx->server_ctx;
456462
remote_ctx->addr_header_len = query_ctx->addr_header_len;
457463
memcpy(remote_ctx->addr_header, query_ctx->addr_header, query_ctx->addr_header_len);
@@ -463,7 +469,10 @@ static void query_resolve_cb(EV_P_ ev_io *w, int revents)
463469

464470
ev_io_start(EV_A_ &remote_ctx->io);
465471

466-
int s = sendto(remote_ctx->fd, query_ctx->buf, query_ctx->buf_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr));
472+
size_t addr_len = sizeof(struct sockaddr_in);
473+
if (remote_ctx->dst_addr.ss_family == AF_INET6)
474+
addr_len = sizeof(struct sockaddr_in6);
475+
int s = sendto(remote_ctx->fd, query_ctx->buf, query_ctx->buf_len, 0, (struct sockaddr *)&remote_ctx->dst_addr, addr_len);
467476

468477
if (s == -1)
469478
{
@@ -574,7 +583,10 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents)
574583
buf = ss_encrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
575584
#endif
576585

577-
int s = sendto(server_ctx->fd, buf, buf_len, 0, &remote_ctx->src_addr, sizeof(remote_ctx->src_addr));
586+
size_t addr_len = sizeof(struct sockaddr_in);
587+
if (remote_ctx->src_addr.ss_family == AF_INET6)
588+
addr_len = sizeof(struct sockaddr_in6);
589+
int s = sendto(server_ctx->fd, buf, buf_len, 0, (struct sockaddr *)&remote_ctx->src_addr, addr_len);
578590

579591
if (s == -1)
580592
{
@@ -589,13 +601,13 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents)
589601
static void server_recv_cb (EV_P_ ev_io *w, int revents)
590602
{
591603
struct server_ctx *server_ctx = (struct server_ctx *)w;
592-
struct sockaddr src_addr;
604+
struct sockaddr_storage src_addr;
593605
char *buf = malloc(BUF_SIZE);
594606

595-
socklen_t src_addr_len = sizeof(src_addr);
607+
socklen_t src_addr_len = sizeof(struct sockaddr_storage);
596608
unsigned int offset = 0;
597609

598-
ssize_t buf_len = recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, &src_addr, &src_addr_len);
610+
ssize_t buf_len = recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr, &src_addr_len);
599611

600612
if (buf_len == -1)
601613
{
@@ -727,14 +739,14 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
727739
{
728740
if (verbose)
729741
{
730-
LOGD("[udp] cache missed: %s:%s <-> %s", host, port, get_addr_str(&src_addr));
742+
LOGD("[udp] cache missed: %s:%s <-> %s", host, port, get_addr_str((struct sockaddr *)&src_addr));
731743
}
732744
}
733745
else
734746
{
735747
if (verbose)
736748
{
737-
LOGD("[udp] cache hit: %s:%s <-> %s", host, port, get_addr_str(&src_addr));
749+
LOGD("[udp] cache hit: %s:%s <-> %s", host, port, get_addr_str((struct sockaddr *)&src_addr));
738750
}
739751
}
740752

@@ -788,7 +800,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
788800
// Init remote_ctx
789801
remote_ctx = new_remote(remotefd, server_ctx);
790802
remote_ctx->src_addr = src_addr;
791-
remote_ctx->dst_addr = *result->ai_addr;
803+
remote_ctx->dst_addr = *((struct sockaddr_storage *)result->ai_addr);
792804
remote_ctx->addr_header_len = addr_header_len;
793805
memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
794806

@@ -810,7 +822,10 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
810822

811823
buf = ss_encrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
812824

813-
int s = sendto(remote_ctx->fd, buf, buf_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr));
825+
size_t addr_len = sizeof(struct sockaddr_in);
826+
if (remote_ctx->dst_addr.ss_family == AF_INET6)
827+
addr_len = sizeof(struct sockaddr_in6);
828+
int s = sendto(remote_ctx->fd, buf, buf_len, 0, (struct sockaddr*)&remote_ctx->dst_addr, addr_len);
814829

815830
if (s == -1)
816831
{
@@ -846,8 +861,11 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
846861
}
847862
else
848863
{
864+
size_t addr_len = sizeof(struct sockaddr_in);
865+
if (remote_ctx->dst_addr.ss_family == AF_INET6)
866+
addr_len = sizeof(struct sockaddr_in6);
849867
int s = sendto(remote_ctx->fd, buf + addr_header_len,
850-
buf_len - addr_header_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr));
868+
buf_len - addr_header_len, 0, (struct sockaddr*)&remote_ctx->dst_addr, addr_len);
851869

852870
if (s == -1)
853871
{

src/udprelay.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ struct resolve_ctx
7070
struct query_ctx
7171
{
7272
asyncns_query_t *query;
73-
struct sockaddr src_addr;
73+
struct sockaddr_storage src_addr;
7474
int buf_len;
7575
char *buf; // server send from, remote recv into
7676
int addr_header_len;
@@ -86,15 +86,15 @@ struct remote_ctx
8686
int fd;
8787
int addr_header_len;
8888
char addr_header[384];
89-
struct sockaddr src_addr;
90-
struct sockaddr dst_addr;
89+
struct sockaddr_storage src_addr;
90+
struct sockaddr_storage dst_addr;
9191
struct server_ctx *server_ctx;
9292
};
9393

9494
static void server_recv_cb (EV_P_ ev_io *w, int revents);
9595
static void remote_recv_cb (EV_P_ ev_io *w, int revents);
9696
static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents);
97-
static char *hash_key(const char *header, const int header_len, const struct sockaddr *addr);
97+
static char *hash_key(const char *header, const int header_len, const struct sockaddr_storage *addr);
9898
#ifdef UDPRELAY_REMOTE
9999
static void query_resolve_cb(EV_P_ ev_io *w, int revents);
100100
#endif

0 commit comments

Comments
 (0)