more robust when only some of the socks info has arrived

svn:r108
This commit is contained in:
Roger Dingledine 2002-09-23 01:04:59 +00:00
parent 155c9b80ca
commit 988c6d4277
2 changed files with 12 additions and 10 deletions

View File

@ -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;

View File

@ -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. */