mirror of
https://github.com/moparisthebest/curl
synced 2025-01-11 05:58:01 -05:00
libssh2: fix transport over HTTPS proxy
The fix in #6021 was not enough. This fix makes sure SCP/SFTP content can also be transfered over a HTTPS proxy. Fixes #6113 Closes #6128
This commit is contained in:
parent
5106f1dc40
commit
9a844625c4
@ -3024,9 +3024,15 @@ static ssize_t ssh_tls_recv(libssh2_socket_t sock, void *buffer,
|
|||||||
struct connectdata *conn = (struct connectdata *)*abstract;
|
struct connectdata *conn = (struct connectdata *)*abstract;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
|
Curl_recv *backup = conn->recv[0];
|
||||||
|
struct ssh_conn *ssh = &conn->proto.sshc;
|
||||||
(void)flags;
|
(void)flags;
|
||||||
|
|
||||||
|
/* swap in the TLS reader function for this call only, and then swap back
|
||||||
|
the SSH one again */
|
||||||
|
conn->recv[0] = ssh->tls_recv;
|
||||||
result = Curl_read(conn, sock, buffer, length, &nread);
|
result = Curl_read(conn, sock, buffer, length, &nread);
|
||||||
|
conn->recv[0] = backup;
|
||||||
if(result == CURLE_AGAIN)
|
if(result == CURLE_AGAIN)
|
||||||
return -EAGAIN; /* magic return code for libssh2 */
|
return -EAGAIN; /* magic return code for libssh2 */
|
||||||
else if(result)
|
else if(result)
|
||||||
@ -3042,9 +3048,15 @@ static ssize_t ssh_tls_send(libssh2_socket_t sock, const void *buffer,
|
|||||||
struct connectdata *conn = (struct connectdata *)*abstract;
|
struct connectdata *conn = (struct connectdata *)*abstract;
|
||||||
ssize_t nwrite;
|
ssize_t nwrite;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
|
Curl_send *backup = conn->send[0];
|
||||||
|
struct ssh_conn *ssh = &conn->proto.sshc;
|
||||||
(void)flags;
|
(void)flags;
|
||||||
|
|
||||||
|
/* swap in the TLS writer function for this call only, and then swap back
|
||||||
|
the SSH one again */
|
||||||
|
conn->send[0] = ssh->tls_send;
|
||||||
result = Curl_write(conn, sock, buffer, length, &nwrite);
|
result = Curl_write(conn, sock, buffer, length, &nwrite);
|
||||||
|
conn->send[0] = backup;
|
||||||
if(result == CURLE_AGAIN)
|
if(result == CURLE_AGAIN)
|
||||||
return -EAGAIN; /* magic return code for libssh2 */
|
return -EAGAIN; /* magic return code for libssh2 */
|
||||||
else if(result)
|
else if(result)
|
||||||
@ -3134,8 +3146,13 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
|
|||||||
LIBSSH2_CALLBACK_RECV, sshrecv.recvp);
|
LIBSSH2_CALLBACK_RECV, sshrecv.recvp);
|
||||||
libssh2_session_callback_set(ssh->ssh_session,
|
libssh2_session_callback_set(ssh->ssh_session,
|
||||||
LIBSSH2_CALLBACK_SEND, sshsend.sendp);
|
LIBSSH2_CALLBACK_SEND, sshsend.sendp);
|
||||||
|
|
||||||
|
/* Store the underlying TLS recv/send function pointers to be used when
|
||||||
|
reading from the proxy */
|
||||||
|
ssh->tls_recv = conn->recv[FIRSTSOCKET];
|
||||||
|
ssh->tls_send = conn->send[FIRSTSOCKET];
|
||||||
}
|
}
|
||||||
else
|
|
||||||
#endif /* CURL_DISABLE_PROXY */
|
#endif /* CURL_DISABLE_PROXY */
|
||||||
if(conn->handler->protocol & CURLPROTO_SCP) {
|
if(conn->handler->protocol & CURLPROTO_SCP) {
|
||||||
conn->recv[FIRSTSOCKET] = scp_recv;
|
conn->recv[FIRSTSOCKET] = scp_recv;
|
||||||
|
@ -182,6 +182,12 @@ struct ssh_conn {
|
|||||||
LIBSSH2_SFTP *sftp_session; /* SFTP handle */
|
LIBSSH2_SFTP *sftp_session; /* SFTP handle */
|
||||||
LIBSSH2_SFTP_HANDLE *sftp_handle;
|
LIBSSH2_SFTP_HANDLE *sftp_handle;
|
||||||
|
|
||||||
|
#ifndef CURL_DISABLE_PROXY
|
||||||
|
/* for HTTPS proxy storage */
|
||||||
|
Curl_recv *tls_recv;
|
||||||
|
Curl_send *tls_send;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBSSH2_AGENT_API
|
#ifdef HAVE_LIBSSH2_AGENT_API
|
||||||
LIBSSH2_AGENT *ssh_agent; /* proxy to ssh-agent/pageant */
|
LIBSSH2_AGENT *ssh_agent; /* proxy to ssh-agent/pageant */
|
||||||
struct libssh2_agent_publickey *sshagent_identity,
|
struct libssh2_agent_publickey *sshagent_identity,
|
||||||
|
Loading…
Reference in New Issue
Block a user