@@ -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 */
7398static 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