-const char gateway_rcs[] = "$Id: gateway.c,v 1.80 2011/10/23 11:20:51 fabiankeil Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.83 2011/12/24 15:28:45 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/gateway.c,v $
/* The error an its reason have already been logged by connect_to() */
return(JB_INVALID_SOCKET);
}
+ else if (write_socket(sfd, (char *)c, csiz))
+ {
+ errstr = "SOCKS4 negotiation write failed.";
+ log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr);
+ err = 1;
+ close_socket(sfd);
+ }
else if (!data_is_available(sfd, csp->config->socket_timeout))
{
if (socket_is_still_alive(sfd))
err = 1;
close_socket(sfd);
}
- else if (write_socket(sfd, (char *)c, csiz))
- {
- errstr = "SOCKS4 negotiation write failed.";
- log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr);
- err = 1;
- close_socket(sfd);
- }
else if (read_socket(sfd, buf, sizeof(buf)) != sizeof(*s))
{
errstr = "SOCKS4 negotiation read failed.";
if (server_size != sizeof(sbuf))
{
errstr = "SOCKS5 negotiation read failed";
- err = 1;
}
-
- if (!err)
+ else
{
if (sbuf[0] != '\x05')
{
assert(errstr != NULL);
csp->error_message = strdup(errstr);
+ if (server_size == -1)
+ {
+ /*
+ * We didn't read() anything from the server at all.
+ * Don't try to log a negative number of characters
+ * which could trigger an assert().
+ */
+ server_size = 0;
+ }
log_error(LOG_LEVEL_CONNECT, "socks5_connect: %s: %N", errstr, server_size, sbuf);
close_socket(sfd);
errno = EINVAL;