summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Hädicke <felixhaedicke@web.de>2019-01-23 23:47:55 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-01-24 09:03:11 +0100
commit15c94b310bf9e0c92d71fca5a88eb67a1e2548a6 (patch)
tree99544ca55c2ea3d376c5367d00d82ecb0cb22a69
parentc497cab49b90f515dd728ce2f510d8396f91f3f6 (diff)
downloadcurl-15c94b310bf9e0c92d71fca5a88eb67a1e2548a6.tar.gz
libssh: do not let libssh create socket
By default, libssh creates a new socket, instead of using the socket created by curl for SSH connections. Pass the socket created by curl to libssh using ssh_options_set() with SSH_OPTIONS_FD directly after ssh_new(). So libssh uses our socket instead of creating a new one. This approach is very similar to what is done in the libssh2 code, where the socket created by curl is passed to libssh2 when libssh2_session_startup() is called. Fixes #3491 Closes #3495
-rw-r--r--lib/ssh-libssh.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/ssh-libssh.c b/lib/ssh-libssh.c
index 2e920f0e9..333df03ef 100644
--- a/lib/ssh-libssh.c
+++ b/lib/ssh-libssh.c
@@ -556,6 +556,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
struct Curl_easy *data = conn->data;
struct SSHPROTO *protop = data->req.protop;
struct ssh_conn *sshc = &conn->proto.sshc;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
int rc = SSH_NO_ERROR, err;
char *new_readdir_line;
int seekerr = CURL_SEEKFUNC_OK;
@@ -799,7 +800,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSH is connected */
- conn->sockfd = ssh_get_fd(sshc->ssh_session);
+ conn->sockfd = sock;
conn->writesockfd = CURL_SOCKET_BAD;
if(conn->handler->protocol == CURLPROTO_SFTP) {
@@ -2052,6 +2053,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
{
struct ssh_conn *ssh;
CURLcode result;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
struct Curl_easy *data = conn->data;
int rc;
@@ -2080,6 +2082,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
return CURLE_FAILED_INIT;
}
+ ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
+
if(conn->user) {
infof(data, "User: %s\n", conn->user);
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);