closed_connection->forwarder_type = SOCKS_NONE;
freez(closed_connection->gateway_host);
closed_connection->gateway_port = 0;
+ freez(closed_connection->auth_username);
+ freez(closed_connection->auth_password);
freez(closed_connection->forward_host);
closed_connection->forward_port = 0;
}
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+/*********************************************************************
+ *
+ * Function : connection_detail_matches
+ *
+ * Description : Helper function for connection_destination_matches().
+ * Compares strings which can be NULL.
+ *
+ * Parameters :
+ * 1 : connection_detail = The connection detail to compare.
+ * 2 : fowarder_detail = The forwarder detail to compare.
+ *
+ * Returns : TRUE for yes, FALSE otherwise.
+ *
+ *********************************************************************/
+static int connection_detail_matches(const char *connection_detail,
+ const char *forwarder_detail)
+{
+ if (connection_detail == NULL && forwarder_detail == NULL)
+ {
+ /* Both details are unset. */
+ return TRUE;
+ }
+
+ if ((connection_detail == NULL && forwarder_detail != NULL)
+ || (connection_detail != NULL && forwarder_detail == NULL))
+ {
+ /* Only one detail isn't set. */
+ return FALSE;
+ }
+
+ /* Both details are set, but do they match? */
+ return(!strcmpic(connection_detail, forwarder_detail));
+
+}
+
+
/*********************************************************************
*
* Function : connection_destination_matches
return FALSE;
}
- if (( (NULL != connection->gateway_host)
- && (NULL != fwd->gateway_host)
- && strcmpic(connection->gateway_host, fwd->gateway_host))
- && (connection->gateway_host != fwd->gateway_host))
+ if (!connection_detail_matches(connection->gateway_host, fwd->gateway_host))
{
log_error(LOG_LEVEL_CONNECT,
"Gateway mismatch. Previous gateway: %s. Current gateway: %s",
- connection->gateway_host, fwd->gateway_host);
+ connection->gateway_host != NULL ? connection->gateway_host : "none",
+ fwd->gateway_host != NULL ? fwd->gateway_host : "none");
+ return FALSE;
+ }
+
+ if (!connection_detail_matches(connection->auth_username, fwd->auth_username))
+ {
+ log_error(LOG_LEVEL_CONNECT, "Socks user name mismatch. "
+ "Previous user name: %s. Current user name: %s",
+ connection->auth_username != NULL ? connection->auth_username : "none",
+ fwd->auth_username != NULL ? fwd->auth_username : "none");
+ return FALSE;
+ }
+
+ if (!connection_detail_matches(connection->auth_password, fwd->auth_password))
+ {
+ log_error(LOG_LEVEL_CONNECT, "Socks user name mismatch. "
+ "Previous password: %s. Current password: %s",
+ connection->auth_password != NULL ? connection->auth_password : "none",
+ fwd->auth_password != NULL ? fwd->auth_password : "none");
return FALSE;
}
- if (( (NULL != connection->forward_host)
- && (NULL != fwd->forward_host)
- && strcmpic(connection->forward_host, fwd->forward_host))
- && (connection->forward_host != fwd->forward_host))
+ if (!connection_detail_matches(connection->forward_host, fwd->forward_host))
{
log_error(LOG_LEVEL_CONNECT,
"Forwarding proxy mismatch. Previous proxy: %s. Current proxy: %s",
- connection->forward_host, fwd->forward_host);
+ connection->forward_host != NULL ? connection->forward_host : "none",
+ fwd->forward_host != NULL ? fwd->forward_host : "none");
return FALSE;
}
header_length= strlen(client_headers);
log_error(LOG_LEVEL_CONNECT,
- "Optimistically sending %d bytes of client headers intended for %s",
+ "Optimistically sending %lu bytes of client headers intended for %s",
header_length, csp->http->hostport);
if (write_socket(sfd, client_headers, header_length))