mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-23 20:03:31 +01:00
more robust when only some of the socks info has arrived
svn:r108
This commit is contained in:
parent
155c9b80ca
commit
988c6d4277
@ -5,7 +5,6 @@
|
|||||||
#include "or.h"
|
#include "or.h"
|
||||||
|
|
||||||
extern int global_role; /* from main.c */
|
extern int global_role; /* from main.c */
|
||||||
static const char socks_userid[] = "anonymous";
|
|
||||||
|
|
||||||
int connection_ap_process_inbuf(connection_t *conn) {
|
int connection_ap_process_inbuf(connection_t *conn) {
|
||||||
|
|
||||||
@ -34,8 +33,6 @@ int connection_ap_process_inbuf(connection_t *conn) {
|
|||||||
int ap_handshake_process_socks(connection_t *conn) {
|
int ap_handshake_process_socks(connection_t *conn) {
|
||||||
char c;
|
char c;
|
||||||
socks4_t socks4_info;
|
socks4_t socks4_info;
|
||||||
static char destaddr[512]; /* XXX there's a race condition waiting to happen here */
|
|
||||||
static int destlen=0;
|
|
||||||
|
|
||||||
assert(conn);
|
assert(conn);
|
||||||
|
|
||||||
@ -85,7 +82,9 @@ int ap_handshake_process_socks(connection_t *conn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!conn->read_username) { /* the socks spec says we've got to read stuff until we get a null */
|
if(!conn->read_username) { /* the socks spec says we've got to read stuff until we get a null */
|
||||||
while(conn->inbuf_datalen) {
|
for(;;) {
|
||||||
|
if(!conn->inbuf_datalen)
|
||||||
|
return 0; /* maybe next time */
|
||||||
if(connection_fetch_from_buf((char *)&c,1,conn) < 0)
|
if(connection_fetch_from_buf((char *)&c,1,conn) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if(!c) {
|
if(!c) {
|
||||||
@ -98,19 +97,19 @@ int ap_handshake_process_socks(connection_t *conn) {
|
|||||||
|
|
||||||
if(!conn->dest_addr) { /* no dest_addr found yet */
|
if(!conn->dest_addr) { /* no dest_addr found yet */
|
||||||
|
|
||||||
while(conn->inbuf_datalen) {
|
for(;;) {
|
||||||
|
if(!conn->inbuf_datalen)
|
||||||
|
return 0; /* maybe next time */
|
||||||
if(connection_fetch_from_buf((char *)&c,1,conn) < 0)
|
if(connection_fetch_from_buf((char *)&c,1,conn) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
destaddr[destlen++] = c;
|
conn->dest_tmp[conn->dest_tmplen++] = c;
|
||||||
if(destlen > 500) {
|
if(conn->dest_tmplen > 500) {
|
||||||
log(LOG_NOTICE,"ap_handshake_process_socks(): dest_addr too long!");
|
log(LOG_NOTICE,"ap_handshake_process_socks(): dest_addr too long!");
|
||||||
ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT);
|
ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT);
|
||||||
destlen = 0;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(!c) { /* we found the null; we're done */
|
if(!c) { /* we found the null; we're done */
|
||||||
conn->dest_addr = strdup(destaddr);
|
conn->dest_addr = strdup(conn->dest_tmp);
|
||||||
destlen = 0;
|
|
||||||
log(LOG_NOTICE,"ap_handshake_process_socks(): successfully read dest addr '%s'",
|
log(LOG_NOTICE,"ap_handshake_process_socks(): successfully read dest addr '%s'",
|
||||||
conn->dest_addr);
|
conn->dest_addr);
|
||||||
break;
|
break;
|
||||||
|
@ -213,6 +213,9 @@ typedef struct
|
|||||||
|
|
||||||
char *dest_addr;
|
char *dest_addr;
|
||||||
uint16_t dest_port;
|
uint16_t dest_port;
|
||||||
|
|
||||||
|
char dest_tmp[512];
|
||||||
|
int dest_tmplen;
|
||||||
|
|
||||||
/* used by OR, to keep state while connect()ing: Kludge. */
|
/* used by OR, to keep state while connect()ing: Kludge. */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user