Skip to content

Commit 77b45a1

Browse files
committed
Fix Ipv6 parsing
1 parent 4ea5c9f commit 77b45a1

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

source/socks5.c

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,31 @@ static int s_ensure_buffer_has_capacity(
6969
return AWS_OP_SUCCESS;
7070
}
7171

72+
/* Normalizes IPv4/IPv6 literals by stripping RFC-3986 decorations such as
73+
* surrounding brackets and scope identifiers (e.g. "%eth0"). Operates in-place
74+
* on a null-terminated buffer. */
75+
static void s_normalize_ip_literal(char *address_buffer) {
76+
if (!address_buffer || address_buffer[0] == '\0') {
77+
return;
78+
}
79+
80+
size_t buf_len = strlen(address_buffer);
81+
if (buf_len > 1 && address_buffer[0] == '[') {
82+
char *closing = strchr(address_buffer, ']');
83+
if (closing && closing > address_buffer) {
84+
size_t literal_len = (size_t)(closing - (address_buffer + 1));
85+
memmove(address_buffer, address_buffer + 1, literal_len);
86+
address_buffer[literal_len] = '\0';
87+
buf_len = literal_len;
88+
}
89+
}
90+
91+
char *zone_delimiter = strchr(address_buffer, '%');
92+
if (zone_delimiter) {
93+
*zone_delimiter = '\0';
94+
}
95+
}
96+
7297
/* Helper for converting auth method enum to string for logging */
7398
static struct aws_string *s_auth_method_to_string(enum aws_socks5_auth_method method) {
7499
switch (method) {
@@ -248,18 +273,7 @@ AWS_IO_API enum aws_socks5_address_type aws_socks5_infer_address_type(
248273
memcpy(address_buffer, target_host.ptr, host_len);
249274
address_buffer[host_len] = '\0';
250275

251-
if (address_buffer[0] == '[') {
252-
size_t buf_len = strlen(address_buffer);
253-
if (buf_len > 1 && address_buffer[buf_len - 1] == ']') {
254-
memmove(address_buffer, address_buffer + 1, buf_len - 2);
255-
address_buffer[buf_len - 2] = '\0';
256-
}
257-
}
258-
259-
char *zone_delimiter = strchr(address_buffer, '%');
260-
if (zone_delimiter) {
261-
*zone_delimiter = '\0';
262-
}
276+
s_normalize_ip_literal(address_buffer);
263277

264278
unsigned char ipv4_buffer[4];
265279
unsigned char ipv6_buffer[16];
@@ -833,6 +847,7 @@ int aws_socks5_write_connect_request(
833847
size_t copy_len = target_len < 127 ? target_len : 127;
834848
memcpy(ip_str, s_string_bytes(context->endpoint_host), copy_len);
835849
ip_str[copy_len] = '\0';
850+
s_normalize_ip_literal(ip_str);
836851

837852
if (inet_pton(AF_INET, ip_str, binary_addr) != 1) {
838853
AWS_LOGF_ERROR(
@@ -867,6 +882,7 @@ int aws_socks5_write_connect_request(
867882
size_t copy_len = target_len < 127 ? target_len : 127;
868883
memcpy(ip_str, s_string_bytes(context->endpoint_host), copy_len);
869884
ip_str[copy_len] = '\0';
885+
s_normalize_ip_literal(ip_str);
870886

871887
if (inet_pton(AF_INET6, ip_str, binary_addr) != 1) {
872888
AWS_LOGF_ERROR(

0 commit comments

Comments
 (0)