- Brian Ulm reported a crash when doing a second SFTP transfer on a re-used
authorDaniel Stenberg <daniel@haxx.se>
Sun, 9 Mar 2008 11:37:48 +0000 (11:37 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 9 Mar 2008 11:37:48 +0000 (11:37 +0000)
  easy handle if curl_easy_reset() was used between them. I fixed it and Brian
  verified that it cured his problem.

- Brian Ulm reported that if you first tried to download a non-existing SFTP
  file and then fetched an existing one and re-used the handle, libcurl would
  still report the second one as non-existing as well! I fixed it abd Brian
  verified that it cured his problem.

CHANGES
RELEASE-NOTES
lib/ssh.c

diff --git a/CHANGES b/CHANGES
index 25664a0..45629cd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,16 @@
 
                                   Changelog
 
+Daniel Stenberg (9 Mar 2008)
+- Brian Ulm reported a crash when doing a second SFTP transfer on a re-used
+  easy handle if curl_easy_reset() was used between them. I fixed it and Brian
+  verified that it cured his problem.
+
+- Brian Ulm reported that if you first tried to download a non-existing SFTP
+  file and then fetched an existing one and re-used the handle, libcurl would
+  still report the second one as non-existing as well! I fixed it abd Brian
+  verified that it cured his problem.
+
 Michal Marek (6 Mar 2008)
 - Fix the gssapi configure check to detect newer MIT Kerberos (patch by
   Michael Calmer)
index e2fff28..cffb667 100644 (file)
@@ -36,6 +36,8 @@ This release includes the following bugfixes:
  o crash when doing Negotiate again on a re-used connection
  o select/poll regression
  o better MIT kerberos configure check
+ o curl_easy_reset() + SFTP re-used connection download crash
+ o SFTP non-existing file + SFTP existing file error
 
 This release includes the following known bugs:
 
@@ -55,6 +57,6 @@ advice from friends like these:
  Michal Marek, Dmitry Kurochkin, Niklas Angebrand, Günter Knauf, Yang Tse,
  Dan Fandrich, Mike Hommey, Pooyan McSporran, Jerome Muffat-Meridol,
  Kaspar Brand, Gautam Kachroo, Zmey Petroff, Georg Lippitsch, Sam Listopad,
- Anatoli Tubman, Mike Protts, Michael Calmer
+ Anatoli Tubman, Mike Protts, Michael Calmer, Brian Ulm
 
         Thanks! (and sorry if I forgot to mention someone)
index 88d5833..22d3ecb 100644 (file)
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -1663,7 +1663,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn)
   }
   else {
     result = Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
-                               FALSE, NULL, -1, NULL);
+                                 FALSE, NULL, -1, NULL);
   }
   if(result) {
     state(conn, SSH_SFTP_CLOSE);
@@ -1966,6 +1966,9 @@ static CURLcode ssh_init(struct connectdata *conn)
 {
   struct SessionHandle *data = conn->data;
   struct SSHPROTO *ssh;
+
+  conn->proto.sshc.actualcode = CURLE_OK; /* reset error code */
+
   if(data->state.proto.ssh)
     return CURLE_OK;
 
@@ -2109,6 +2112,18 @@ static CURLcode ssh_do(struct connectdata *conn, bool *done)
 
   *done = FALSE; /* default to false */
 
+  /*
+    Since connections can be re-used between SessionHandles, this might be a
+    connection already existing but on a fresh SessionHandle struct so we must
+    make sure we have a good 'struct SSHPROTO' to play with. For new
+    connections, the struct SSHPROTO is allocated and setup in the
+    ssh_connect() function.
+  */
+  Curl_reset_reqproto(conn);
+  res = ssh_init(conn);
+  if(res)
+    return res;
+
   data->req.size = -1; /* make sure this is unknown at this point */
 
   Curl_pgrsSetUploadCounter(data, 0);