mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-29 04:03:45 +00:00
fix #341
This commit is contained in:
+16
-3
@@ -632,12 +632,24 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
#ifdef UDPRELAY_REDIR
|
||||
struct sockaddr_storage dst_addr;
|
||||
memset(&dst_addr, 0, sizeof(struct sockaddr_storage));
|
||||
int len = parse_udprealy_header(buf, buf_len, NULL, NULL, &dst_addr);
|
||||
|
||||
if (len != 0) {
|
||||
memcpy(&(remote_ctx->dst_addr), &dst_addr, get_sockaddr_len((struct sockaddr *)&dst_addr));
|
||||
}
|
||||
#else
|
||||
int len = parse_udprealy_header(buf, buf_len, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
if (len == 0) {
|
||||
LOGI("[udp] error in parse header");
|
||||
// error in parse header
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
// server may return using a different address type other than the type we
|
||||
// have used during sending
|
||||
|
||||
@@ -1017,9 +1029,6 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
// Init remote_ctx
|
||||
remote_ctx = new_remote(remotefd, server_ctx);
|
||||
remote_ctx->src_addr = src_addr;
|
||||
#ifdef UDPRELAY_REDIR
|
||||
memcpy(&(remote_ctx->dst_addr), &dst_addr, get_sockaddr_len((struct sockaddr *)&dst_addr));
|
||||
#endif
|
||||
remote_ctx->af = remote_addr->sa_family;
|
||||
remote_ctx->addr_header_len = addr_header_len;
|
||||
memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
|
||||
@@ -1032,6 +1041,10 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_timer_start(EV_A_ & remote_ctx->watcher);
|
||||
}
|
||||
|
||||
#ifdef UDPRELAY_REDIR
|
||||
memcpy(&(remote_ctx->dst_addr), &dst_addr, get_sockaddr_len((struct sockaddr *)&dst_addr));
|
||||
#endif
|
||||
|
||||
if (offset > 0) {
|
||||
buf_len -= offset;
|
||||
memmove(buf, buf + offset, buf_len);
|
||||
|
||||
Reference in New Issue
Block a user