70232dd
From 095d4cf3b1c388b2871e3783f8c41b1e01200a25 Mon Sep 17 00:00:00 2001
70232dd
From: =?UTF-8?q?Felix=20H=C3=A4dicke?= <felixhaedicke@web.de>
70232dd
Date: Wed, 23 Jan 2019 23:47:55 +0100
70232dd
Subject: [PATCH] libssh: do not let libssh create socket
70232dd
70232dd
By default, libssh creates a new socket, instead of using the socket
70232dd
created by curl for SSH connections.
70232dd
70232dd
Pass the socket created by curl to libssh using ssh_options_set() with
70232dd
SSH_OPTIONS_FD directly after ssh_new(). So libssh uses our socket
70232dd
instead of creating a new one.
70232dd
70232dd
This approach is very similar to what is done in the libssh2 code, where
70232dd
the socket created by curl is passed to libssh2 when
70232dd
libssh2_session_startup() is called.
70232dd
70232dd
Fixes #3491
70232dd
Closes #3495
70232dd
70232dd
Upstream-commit: 15c94b310bf9e0c92d71fca5a88eb67a1e2548a6
70232dd
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
70232dd
---
70232dd
 lib/ssh-libssh.c | 6 +++++-
70232dd
 1 file changed, 5 insertions(+), 1 deletion(-)
70232dd
70232dd
diff --git a/lib/ssh-libssh.c b/lib/ssh-libssh.c
70232dd
index 7d59089..4110be2 100644
70232dd
--- a/lib/ssh-libssh.c
70232dd
+++ b/lib/ssh-libssh.c
70232dd
@@ -549,6 +549,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
70232dd
   struct Curl_easy *data = conn->data;
70232dd
   struct SSHPROTO *protop = data->req.protop;
70232dd
   struct ssh_conn *sshc = &conn->proto.sshc;
70232dd
+  curl_socket_t sock = conn->sock[FIRSTSOCKET];
70232dd
   int rc = SSH_NO_ERROR, err;
70232dd
   char *new_readdir_line;
70232dd
   int seekerr = CURL_SEEKFUNC_OK;
70232dd
@@ -792,7 +793,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
70232dd
 
70232dd
       Curl_pgrsTime(conn->data, TIMER_APPCONNECT);      /* SSH is connected */
70232dd
 
70232dd
-      conn->sockfd = ssh_get_fd(sshc->ssh_session);
70232dd
+      conn->sockfd = sock;
70232dd
       conn->writesockfd = CURL_SOCKET_BAD;
70232dd
 
70232dd
       if(conn->handler->protocol == CURLPROTO_SFTP) {
70232dd
@@ -2048,6 +2049,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
70232dd
 {
70232dd
   struct ssh_conn *ssh;
70232dd
   CURLcode result;
70232dd
+  curl_socket_t sock = conn->sock[FIRSTSOCKET];
70232dd
   struct Curl_easy *data = conn->data;
70232dd
   int rc;
70232dd
 
70232dd
@@ -2076,6 +2078,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
70232dd
     return CURLE_FAILED_INIT;
70232dd
   }
70232dd
 
70232dd
+  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
70232dd
+
70232dd
   if(conn->user) {
70232dd
     infof(data, "User: %s\n", conn->user);
70232dd
     ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
70232dd
-- 
70232dd
2.17.2
70232dd