aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES9
-rw-r--r--RELEASE-NOTES1
-rw-r--r--lib/ssh.c32
3 files changed, 23 insertions, 19 deletions
diff --git a/CHANGES b/CHANGES
index 5bc7c64c9..618c4f97c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,15 @@
Changelog
+Daniel Stenberg (17 Dec 2008)
+- SCP and SFTP with the multi interface had the same flaw: the 'DONE'
+ operation didn't complete properly if the EAGAIN equivalent was returned but
+ libcurl would simply continue with a half-completed close operation
+ performed. This ruined persistent connection re-use and cause some
+ SSH-protocol errors in general. The correction is unfortunately adding a
+ blocking function - doing it entirely non-blocking should be considered for
+ a better fix.
+
Gisle Vanem (16 Dec 2008)
- Added the possibility to use the Watt-32 tcp/ip stack under Windows.
The change simply involved adding a USE_WATT32 section in the
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 6183d4364..a4202cc5d 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -31,6 +31,7 @@ This release includes the following bugfixes:
o curl_easy_duphandle() doesn't try to duplicate the connection cache pointer
o build failure on OS/400 when enabling IPv6
o better detection of SFTP failures
+ o improved connection re-use for subsequent SCP and SFTP trnasfers
This release includes the following known bugs:
diff --git a/lib/ssh.c b/lib/ssh.c
index c97d0c7e8..08ccf0a72 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -2309,30 +2309,24 @@ static CURLcode scp_disconnect(struct connectdata *conn)
static CURLcode ssh_done(struct connectdata *conn, CURLcode status)
{
CURLcode result = CURLE_OK;
- bool done = FALSE;
+ struct SSHPROTO *sftp_scp = conn->data->state.proto.ssh;
if(status == CURLE_OK) {
- /* run the state-machine */
- if(conn->data->state.used_interface == Curl_if_multi) {
- result = ssh_multi_statemach(conn, &done);
- }
- else {
- result = ssh_easy_statemach(conn);
- done = TRUE;
- }
+ /* run the state-machine
+
+ TODO: when the multi interface this _really_ should be using the
+ ssh_multi_statemach function but we have no general support for
+ non-blocking DONE operations, not in the multi state machine and with
+ Curl_done() invokes on several places in the code!
+ */
+ result = ssh_easy_statemach(conn);
}
- else {
+ else
result = status;
- done = TRUE;
- }
-
- if(done) {
- struct SSHPROTO *sftp_scp = conn->data->state.proto.ssh;
- Curl_safefree(sftp_scp->path);
- sftp_scp->path = NULL;
- Curl_pgrsDone(conn);
- }
+ Curl_safefree(sftp_scp->path);
+ sftp_scp->path = NULL;
+ Curl_pgrsDone(conn);
return result;
}