- cbuf[client_pos++] = '\x03'; /* Address is domain name */
- cbuf[client_pos++] = (char)(hostlen & 0xffu);
- assert(sizeof(cbuf) - client_pos > (size_t)255);
- /* Using strncpy because we really want the nul byte padding. */
- strncpy(cbuf + client_pos, target_host, sizeof(cbuf) - client_pos - 1);
- client_pos += (hostlen & 0xffu);
+ if (host_is_ip_address(target_host) && NULL == strstr(target_host, ":"))
+ {
+ cbuf[client_pos++] = '\x01'; /* Address is IPv4 address. */
+ if (JB_ERR_OK != convert_ipv4_address_to_bytes(target_host, &cbuf[client_pos]))
+ {
+ errstr = "SOCKS5 error. Failed to convert target address to IP address";
+ csp->error_message = strdup(errstr);
+ log_error(LOG_LEVEL_CONNECT, "%s", errstr);
+ close_socket(sfd);
+ errno = EINVAL;
+ return(JB_INVALID_SOCKET);
+ }
+ client_pos += 4;
+ }
+ else
+ {
+ /*
+ * XXX: This branch is currently also used for IPv6 addresses
+ */
+ cbuf[client_pos++] = '\x03'; /* Address is domain name. */
+ cbuf[client_pos++] = (char)(hostlen & 0xffu);
+ assert(sizeof(cbuf) - client_pos > (size_t)255);
+ /* Using strncpy because we really want the nul byte padding. */
+ strncpy(cbuf + client_pos, target_host, sizeof(cbuf) - client_pos - 1);
+ client_pos += (hostlen & 0xffu);
+ }