I have found that connections via a SOCKS5 proxy are failing when using the multi interface. The symptoms are that the proxy does not receive the setup packets/auth packets and instead libcurl sends the request data directly resulting in a socks protocol error. I have looked through the code in git and done some tests, it appears that libcurl 7.20.0 works fine but 7.20.1 results in socks protocol errors. (I noticed this when upgrading libcurl used by my app from 7.19.6 to 7.21.0.
Further tests indicate that Commit:4b351d018e3d6691191fd653a17f14f4a31e0b4c introduced un expected behaviour with socks proxies and the multi interface.
The problem occurs in the multi interface state machine, because on the multi interface connects are non blocking have have a timeout of 0, the STATE_CONNECT returns before the socket to the proxy is connected and we enter the STATE_WAITCONNECT
/* awaiting a completion of an asynch connect */
easy->result = Curl_is_connected(easy->easy_conn,
/* see if we need to do any proxy magic first once we connected */
easy->result = Curl_connected_proxy(easy->easy_conn);
Curl_is_connected() since 4b351d018 sets conn->bits.tcpconnect = TRUE;
Curl_connected_proxy() tests for conn->bits.tcpconnect == TRUE and returns with out setting up the proxy
Attached is a patch that allows Curl_connected_proxy() to run when conn->bits.tcpconnect == TRUE and the multi interface is in use, comments in that function seem to suguest that this should have been allowed?