From 06bbf3d86cd78473e701edd855312126524e365d Mon Sep 17 00:00:00 2001 From: Max Lv Date: Wed, 19 Aug 2026 18:27:19 +0800 Subject: [PATCH] Use snprintf for port formatting The buffers were all large enough for a uint16, so none of these could actually overflow, but sprintf gives the compiler and the linters nothing to check. Passing the destination size makes that guarantee explicit and survives any later change to the buffers. parse_udprelay_header writes through a caller-supplied pointer, so it uses the MAX_PORT_STR_LEN contract its callers already allocate to. --- src/local.c | 10 +++++----- src/udprelay.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/local.c b/src/local.c index 5a1c6fd9..8912bcc4 100644 --- a/src/local.c +++ b/src/local.c @@ -396,7 +396,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf) LOGI("inet_ntop(AF_INET): %s", strerror(errno)); ip[0] = '\0'; } - sprintf(port, "%d", p); + snprintf(port, sizeof(port), "%d", p); } } else if (atyp == SOCKS5_ATYP_DOMAIN) { if (buf->len < request_len + 1) { @@ -414,7 +414,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf) uint16_t p = load16_be(buf->data + request_len + 1 + name_len); memcpy(host, buf->data + request_len + 1, name_len); host[name_len] = '\0'; - sprintf(port, "%d", p); + snprintf(port, sizeof(port), "%d", p); } } else if (atyp == SOCKS5_ATYP_IPV6) { size_t in6_addr_len = sizeof(struct in6_addr); @@ -431,7 +431,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf) LOGI("inet_ntop(AF_INET6): %s", strerror(errno)); ip[0] = '\0'; } - sprintf(port, "%d", p); + snprintf(port, sizeof(port), "%d", p); } } else { LOGE("unsupported addrtype: %d", request->atyp); @@ -2079,8 +2079,8 @@ _start_ss_local_server(profile_t profile, ss_local_callback callback, void *udat char local_port_str[16]; char remote_port_str[16]; - sprintf(local_port_str, "%d", local_port); - sprintf(remote_port_str, "%d", remote_port); + snprintf(local_port_str, sizeof(local_port_str), "%d", local_port); + snprintf(remote_port_str, sizeof(remote_port_str), "%d", remote_port); #ifdef __MINGW32__ winsock_init(); diff --git a/src/udprelay.c b/src/udprelay.c index 824391aa..d90fd2a8 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -328,7 +328,7 @@ parse_udprelay_header(const char *buf, const size_t buf_len, } if (port != NULL) { - sprintf(port, "%d", load16_be(buf + offset)); + snprintf(port, MAX_PORT_STR_LEN, "%d", load16_be(buf + offset)); } offset += 2; @@ -351,14 +351,14 @@ get_addr_str(const struct sockaddr *sa, bool has_port) memcpy(&sa_in, sa, sizeof(struct sockaddr_in)); inet_ntop(AF_INET, &sa_in.sin_addr, addr, INET_ADDRSTRLEN); p = ntohs(sa_in.sin_port); - sprintf(port, "%d", p); + snprintf(port, sizeof(port), "%d", p); break; case AF_INET6: memcpy(&sa_in6, sa, sizeof(struct sockaddr_in6)); inet_ntop(AF_INET6, &sa_in6.sin6_addr, addr, INET6_ADDRSTRLEN); p = ntohs(sa_in6.sin6_port); - sprintf(port, "%d", p); + snprintf(port, sizeof(port), "%d", p); break; default: