From 98a578bfeae84eec450426bdfc7f76fada64ab68 Mon Sep 17 00:00:00 2001 From: yzhivik Date: Thu, 23 Aug 2018 12:49:44 +0300 Subject: [PATCH 1/4] fix SOCKS5 username\password set. fix SOCKS5 request --- lib/socks_mosq.c | 61 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/lib/socks_mosq.c b/lib/socks_mosq.c index 1930cc732..a51d04b06 100644 --- a/lib/socks_mosq.c +++ b/lib/socks_mosq.c @@ -18,6 +18,8 @@ and the Eclipse Distribution License is available at #include #include +#include +#include #include "mosquitto_internal.h" #include "memory_mosq.h" @@ -75,8 +77,10 @@ int mosquitto_socks5_set(struct mosquitto *mosq, const char *host, int port, con if(password){ mosq->socks5_password = mosquitto__strdup(password); - mosquitto__free(mosq->socks5_username); - return MOSQ_ERR_NOMEM; + if(!mosq->socks5_password){ + mosquitto__free(mosq->socks5_username); + return MOSQ_ERR_NOMEM; + } } } @@ -133,19 +137,46 @@ int socks5__send(struct mosquitto *mosq) packet = mosquitto__calloc(1, sizeof(struct mosquitto__packet)); if(!packet) return MOSQ_ERR_NOMEM; - packet->packet_length = 7+strlen(mosq->host); - packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); - - slen = strlen(mosq->host); - - packet->payload[0] = 0x05; - packet->payload[1] = 1; - packet->payload[2] = 0; - packet->payload[3] = SOCKS_ATYPE_DOMAINNAME; - packet->payload[4] = slen; - memcpy(&(packet->payload[5]), mosq->host, slen); - packet->payload[5+slen] = MOSQ_MSB(mosq->port); - packet->payload[6+slen] = MOSQ_LSB(mosq->port); + struct in_addr addr_ipv4; + struct in6_addr addr_ipv6; + + int ipv4_pton_result = inet_pton(AF_INET, mosq->host, &addr_ipv4); + int ipv6_pton_result = inet_pton(AF_INET6, mosq->host, &addr_ipv6); + + if (ipv4_pton_result == 1) { // OK + packet->packet_length = 10; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[0] = 0x05; + packet->payload[1] = 0x01; + packet->payload[2] = 0x00; + packet->payload[3] = SOCKS_ATYPE_IP_V4; + memcpy(&(packet->payload[4]), (const void*)&addr_ipv4, 4); + packet->payload[4+4] = MOSQ_MSB(mosq->port); + packet->payload[4+4+1] = MOSQ_LSB(mosq->port); + } else if (ipv6_pton_result == 1) { + packet->packet_length = 22; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[0] = 0x05; + packet->payload[1] = 0x01; + packet->payload[2] = 0x00; + packet->payload[3] = SOCKS_ATYPE_IP_V6; + memcpy(&(packet->payload[4]), (const void*)&addr_ipv6, 16); + packet->payload[4+16] = MOSQ_MSB(mosq->port); + packet->payload[4+16+1] = MOSQ_LSB(mosq->port); + } else { + slen = strlen(mosq->host); + if (slen > UCHAR_MAX) return MOSQ_ERR_NOMEM; + packet->packet_length = 7 + slen; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[0] = 0x05; + packet->payload[1] = 0x01; + packet->payload[2] = 0x00; + packet->payload[3] = SOCKS_ATYPE_DOMAINNAME; + packet->payload[4] = (uint8_t)slen; + memcpy(&(packet->payload[5]), mosq->host, slen); + packet->payload[5+slen] = MOSQ_MSB(mosq->port); + packet->payload[6+slen] = MOSQ_LSB(mosq->port); + } pthread_mutex_lock(&mosq->state_mutex); mosq->state = mosq_cs_socks5_request; From 15e84c34cd035177306bd1467da126602c8f383e Mon Sep 17 00:00:00 2001 From: yzhivik Date: Fri, 31 Aug 2018 10:59:40 +0300 Subject: [PATCH 2/4] fix SOCKS5 username and password set Signed-off-by: yzhivik --- lib/socks_mosq.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/socks_mosq.c b/lib/socks_mosq.c index 1930cc732..827116d50 100644 --- a/lib/socks_mosq.c +++ b/lib/socks_mosq.c @@ -75,8 +75,10 @@ int mosquitto_socks5_set(struct mosquitto *mosq, const char *host, int port, con if(password){ mosq->socks5_password = mosquitto__strdup(password); - mosquitto__free(mosq->socks5_username); - return MOSQ_ERR_NOMEM; + if(!mosq->socks5_password){ + mosquitto__free(mosq->socks5_username); + return MOSQ_ERR_NOMEM; + } } } From 4654995a26e48786a4d2caba31e178a3624c96e8 Mon Sep 17 00:00:00 2001 From: yzhivik Date: Fri, 31 Aug 2018 11:22:58 +0300 Subject: [PATCH 3/4] fix SOCKS5 request wrt IP4/IP6/FQDN Signed-off-by: yzhivik --- lib/socks_mosq.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/lib/socks_mosq.c b/lib/socks_mosq.c index 827116d50..ae9bf3bdd 100644 --- a/lib/socks_mosq.c +++ b/lib/socks_mosq.c @@ -18,6 +18,8 @@ and the Eclipse Distribution License is available at #include #include +#include +#include #include "mosquitto_internal.h" #include "memory_mosq.h" @@ -135,20 +137,43 @@ int socks5__send(struct mosquitto *mosq) packet = mosquitto__calloc(1, sizeof(struct mosquitto__packet)); if(!packet) return MOSQ_ERR_NOMEM; - packet->packet_length = 7+strlen(mosq->host); - packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + struct in_addr addr_ipv4; + struct in6_addr addr_ipv6; - slen = strlen(mosq->host); + int ipv4_pton_result = inet_pton(AF_INET, mosq->host, &addr_ipv4); + int ipv6_pton_result = inet_pton(AF_INET6, mosq->host, &addr_ipv6); packet->payload[0] = 0x05; - packet->payload[1] = 1; - packet->payload[2] = 0; - packet->payload[3] = SOCKS_ATYPE_DOMAINNAME; - packet->payload[4] = slen; - memcpy(&(packet->payload[5]), mosq->host, slen); - packet->payload[5+slen] = MOSQ_MSB(mosq->port); - packet->payload[6+slen] = MOSQ_LSB(mosq->port); - + packet->payload[1] = 0x01; + packet->payload[2] = 0x00; + + if(ipv4_pton_result == 1){ + packet->packet_length = 10; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[3] = SOCKS_ATYPE_IP_V4; + memcpy(&(packet->payload[4]), (const void*)&addr_ipv4, 4); + packet->payload[4+4] = MOSQ_MSB(mosq->port); + packet->payload[4+4+1] = MOSQ_LSB(mosq->port); + }else if(ipv6_pton_result == 1){ + packet->packet_length = 22; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[3] = SOCKS_ATYPE_IP_V6; + memcpy(&(packet->payload[4]), (const void*)&addr_ipv6, 16); + packet->payload[4+16] = MOSQ_MSB(mosq->port); + packet->payload[4+16+1] = MOSQ_LSB(mosq->port); + }else{ + slen = strlen(mosq->host); + if(slen > UCHAR_MAX){ + return MOSQ_ERR_NOMEM; + } + packet->packet_length = 7 + slen; + packet->payload = mosquitto__malloc(sizeof(uint8_t)*packet->packet_length); + packet->payload[3] = SOCKS_ATYPE_DOMAINNAME; + packet->payload[4] = (uint8_t)slen; + memcpy(&(packet->payload[5]), mosq->host, slen); + packet->payload[5+slen] = MOSQ_MSB(mosq->port); + packet->payload[6+slen] = MOSQ_LSB(mosq->port); + } pthread_mutex_lock(&mosq->state_mutex); mosq->state = mosq_cs_socks5_request; pthread_mutex_unlock(&mosq->state_mutex); From 3ce7a3b942eaa34514fe43a2d62a8872fd525099 Mon Sep 17 00:00:00 2001 From: yzhivik Date: Fri, 31 Aug 2018 11:28:44 +0300 Subject: [PATCH 4/4] fix coding style Signed-off-by: yzhivik --- lib/socks_mosq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/socks_mosq.c b/lib/socks_mosq.c index ae9bf3bdd..737a1aef6 100644 --- a/lib/socks_mosq.c +++ b/lib/socks_mosq.c @@ -80,7 +80,7 @@ int mosquitto_socks5_set(struct mosquitto *mosq, const char *host, int port, con if(!mosq->socks5_password){ mosquitto__free(mosq->socks5_username); return MOSQ_ERR_NOMEM; - } + } } }