Fix segmentation fault when trying to connect via a SOCKS5 proxy.
This commit is contained in:
parent
053af97c9e
commit
ee63f2a32b
1 changed files with 35 additions and 6 deletions
41
src/meta.c
41
src/meta.c
|
@ -185,7 +185,10 @@ bool receive_meta(connection_t *c) {
|
||||||
|
|
||||||
if(c->tcplen) {
|
if(c->tcplen) {
|
||||||
char *tcpbuffer = buffer_read(&c->inbuf, c->tcplen);
|
char *tcpbuffer = buffer_read(&c->inbuf, c->tcplen);
|
||||||
if(tcpbuffer) {
|
if(!tcpbuffer)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(!c->node) {
|
||||||
if(proxytype == PROXY_SOCKS4 && c->allow_request == ID) {
|
if(proxytype == PROXY_SOCKS4 && c->allow_request == ID) {
|
||||||
if(tcpbuffer[0] == 0 && tcpbuffer[1] == 0x5a) {
|
if(tcpbuffer[0] == 0 && tcpbuffer[1] == 0x5a) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Proxy request granted");
|
logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Proxy request granted");
|
||||||
|
@ -193,13 +196,39 @@ bool receive_meta(connection_t *c) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_ERR, "Proxy request rejected");
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Proxy request rejected");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else
|
} else if(proxytype == PROXY_SOCKS5 && c->allow_request == ID) {
|
||||||
receive_tcppacket(c, tcpbuffer, c->tcplen);
|
if(tcpbuffer[0] != 5) {
|
||||||
c->tcplen = 0;
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Invalid response from proxy server");
|
||||||
continue;
|
return false;
|
||||||
|
}
|
||||||
|
if(tcpbuffer[1] == 0xff) {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Proxy request rejected: unsuitable authentication method");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(tcpbuffer[2] != 5) {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Invalid response from proxy server");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(tcpbuffer[3] == 0) {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Proxy request granted");
|
||||||
|
} else {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Proxy request rejected");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "c->tcplen set but c->node is NULL!");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
break;
|
if(c->allow_request == ALL) {
|
||||||
|
receive_tcppacket(c, tcpbuffer, c->tcplen);
|
||||||
|
} else {
|
||||||
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Got unauthorized TCP packet from %s (%s)", c->name, c->hostname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c->tcplen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise we are waiting for a request */
|
/* Otherwise we are waiting for a request */
|
||||||
|
|
Loading…
Reference in a new issue