gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnurl] 152/254: ssh: ignore timeouts during disconnect


From: gnunet
Subject: [GNUnet-SVN] [gnurl] 152/254: ssh: ignore timeouts during disconnect
Date: Sat, 17 Jun 2017 16:53:04 +0200

This is an automated email from the git hooks/post-receive script.

ng0 pushed a commit to annotated tag gnurl-7.54.1
in repository gnurl.

commit f31760e63b4e9ef1eb25f8f211390f8239388515
Author: Daniel Stenberg <address@hidden>
AuthorDate: Thu May 18 13:04:52 2017 +0200

    ssh: ignore timeouts during disconnect
    
    ... as otherwise it risks not cleaning up the libssh2 handle properly
    which leads to memory leak!
    
    Assisted-by: Joel Depooter
    
    Closes #1495
    Closes #1479
    
    Bug: https://curl.haxx.se/mail/lib-2017-04/0024.html
---
 lib/ssh.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/lib/ssh.c b/lib/ssh.c
index 863d7fd54..3670c750a 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -113,6 +113,7 @@
         libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
                                 (t), (m), LIBSSH2_SFTP_REALPATH)
 
+
 /* Local functions: */
 static const char *sftp_libssh2_strerror(int err);
 static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
@@ -2815,7 +2816,7 @@ static CURLcode ssh_multi_statemach(struct connectdata 
*conn, bool *done)
 }
 
 static CURLcode ssh_block_statemach(struct connectdata *conn,
-                                   bool duringconnect)
+                                    bool disconnect)
 {
   struct ssh_conn *sshc = &conn->proto.sshc;
   CURLcode result = CURLE_OK;
@@ -2830,17 +2831,19 @@ static CURLcode ssh_block_statemach(struct connectdata 
*conn,
     if(result)
       break;
 
-    if(Curl_pgrsUpdate(conn))
-      return CURLE_ABORTED_BY_CALLBACK;
+    if(!disconnect) {
+      if(Curl_pgrsUpdate(conn))
+        return CURLE_ABORTED_BY_CALLBACK;
 
-    result = Curl_speedcheck(data, now);
-    if(result)
-      break;
+      result = Curl_speedcheck(data, now);
+      if(result)
+        break;
 
-    left = Curl_timeleft(data, NULL, duringconnect);
-    if(left < 0) {
-      failf(data, "Operation timed out");
-      return CURLE_OPERATION_TIMEDOUT;
+      left = Curl_timeleft(data, NULL, FALSE);
+      if(left < 0) {
+        failf(data, "Operation timed out");
+        return CURLE_OPERATION_TIMEDOUT;
+      }
     }
 
 #ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
@@ -3056,7 +3059,7 @@ static CURLcode scp_disconnect(struct connectdata *conn, 
bool dead_connection)
 
     state(conn, SSH_SESSION_DISCONNECT);
 
-    result = ssh_block_statemach(conn, FALSE);
+    result = ssh_block_statemach(conn, TRUE);
   }
 
   return result;
@@ -3210,7 +3213,7 @@ static CURLcode sftp_disconnect(struct connectdata *conn, 
bool dead_connection)
   if(conn->proto.sshc.ssh_session) {
     /* only if there's a session still around to use! */
     state(conn, SSH_SFTP_SHUTDOWN);
-    result = ssh_block_statemach(conn, FALSE);
+    result = ssh_block_statemach(conn, TRUE);
   }
 
   DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]