diff --git a/src/udprelay.c b/src/udprelay.c index a3e7443c..fc509410 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -635,18 +635,20 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) if (buf_len == -1) { // error on recv // simply drop that packet - if (verbose) { - ERROR("[udp] server_recvfrom"); - } + ERROR("[udp] remote_recvfrom"); + goto CLEAN_UP; + } + + // Drop large packets > default MTU + if (buf_len > MTU) { + LOGE("[udp] drop large packets, size: %ld", buf_len); goto CLEAN_UP; } #ifdef UDPRELAY_LOCAL buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method); if (buf == NULL) { - if (verbose) { - ERROR("[udp] server_ss_decrypt_all"); - } + ERROR("[udp] server_ss_decrypt_all"); goto CLEAN_UP; } @@ -797,6 +799,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) LOGE("[udp] unable to get dest addr"); goto CLEAN_UP; } + + src_addr_len = msg.msg_namelen; #else ssize_t buf_len = recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr, @@ -805,9 +809,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) if (buf_len == -1) { // error on recv // simply drop that packet - if (verbose) { - ERROR("[udp] server_recvfrom"); - } + ERROR("[udp] server_recvfrom"); goto CLEAN_UP; } #endif @@ -819,9 +821,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) #ifdef UDPRELAY_REMOTE buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method); if (buf == NULL) { - if (verbose) { - ERROR("[udp] server_ss_decrypt_all"); - } + ERROR("[udp] server_ss_decrypt_all"); goto CLEAN_UP; } #endif @@ -833,6 +833,12 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) #endif #endif + // Drop large packets > default MTU + if (buf_len > MTU) { + LOGE("[udp] drop large packets, size: %ld", buf_len); + goto CLEAN_UP; + } + /* * * SOCKS5 UDP Request diff --git a/src/udprelay.h b/src/udprelay.h index ec235906..b6879ab6 100644 --- a/src/udprelay.h +++ b/src/udprelay.h @@ -37,7 +37,9 @@ #include "common.h" -#define MAX_UDP_PACKET_SIZE (64 * 1024) +#define MAX_UDP_PACKET_SIZE (2 * 1024) // large enough for a typical MTU 1500 + +#define MTU 1421 // 1492 - 1 - 28 - 2 - 40 = 1421, the default MTU for UDP relay struct server_ctx { ev_io io;