mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-29 20:43:44 +00:00
Fix a header mismatch issue in udp relay
This commit is contained in:
+10
-9
@@ -713,17 +713,19 @@ remote_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
char host[257] = { 0 };
|
||||
char port[64] = { 0 };
|
||||
#ifdef MODULE_REDIR
|
||||
struct sockaddr_storage dst_addr;
|
||||
memset(&dst_addr, 0, sizeof(struct sockaddr_storage));
|
||||
int len = parse_udprelay_header(buf->data, buf->len, NULL, NULL, &dst_addr);
|
||||
int len = parse_udprelay_header(buf->data, buf->len, host, port, &dst_addr);
|
||||
|
||||
if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {
|
||||
LOGI("[udp] ss-redir does not support domain name");
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
#else
|
||||
int len = parse_udprelay_header(buf->data, buf->len, NULL, NULL, NULL);
|
||||
int len = parse_udprelay_header(buf->data, buf->len, host, port, NULL);
|
||||
#endif
|
||||
|
||||
if (len == 0) {
|
||||
@@ -733,12 +735,10 @@ remote_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
if (remote_ctx->addr_header_len != len
|
||||
|| memcmp(buf->data, remote_ctx->addr_header, len) != 0) {
|
||||
if (verbose && (remote_ctx->addr_header_len != len
|
||||
|| memcmp(buf->data, remote_ctx->addr_header, len) != 0)) {
|
||||
// mismatched header
|
||||
if (verbose)
|
||||
LOGI("[udp] mismatched header");
|
||||
goto CLEAN_UP;
|
||||
LOGI("[udp] mismatched header from %s:%s", host, port);
|
||||
}
|
||||
|
||||
// server may return using a different address type other than the type we
|
||||
@@ -1168,8 +1168,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
remote_ctx = new_remote(remotefd, server_ctx);
|
||||
remote_ctx->src_addr = src_addr;
|
||||
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);
|
||||
|
||||
// Add to conn cache
|
||||
cache_insert(conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);
|
||||
@@ -1179,6 +1177,9 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_timer_start(EV_A_ & remote_ctx->watcher);
|
||||
}
|
||||
|
||||
remote_ctx->addr_header_len = addr_header_len;
|
||||
memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
|
||||
|
||||
if (offset > 0) {
|
||||
buf->len -= offset;
|
||||
memmove(buf->data, buf->data + offset, buf->len);
|
||||
|
||||
Reference in New Issue
Block a user