diff --git a/CHANGES b/CHANGES index 25664a012..45629cdf9 100644 --- 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) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index e2fff281d..cffb6678c 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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) diff --git a/lib/ssh.c b/lib/ssh.c index 88d5833d9..22d3ecb27 100644 --- 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);