diff --git a/CHANGES b/CHANGES index 33e4230d4..7c59d067a 100644 --- a/CHANGES +++ b/CHANGES @@ -8,10 +8,20 @@ +Daniel (10 January 2006) +- When using a bad path over FTP, as in when libcurl couldn't CWD into all + given subdirs, libcurl would still "remember" the full path as if it is the + current directory libcurl is in so that the next curl_easy_perform() would + get really confused if it tried the same path again - as it would not issue + any CWD commands at all, assuming it is already in the "proper" dir. + + Starting now, a failed CWD command sets a flag that prevents the path to be + "remembered" after returning. + Daniel (7 January 2006) -- Mike Jean fixed so that the second CONNECT when doing FTP over a HTTP proxy - actually used a new connection and not sent the second request on the first - socket! +- Michael Jahn fixed so that the second CONNECT when doing FTP over a HTTP + proxy actually used a new connection and not sent the second request on the + first socket! Daniel (6 January 2006) - Alexander Lazic made the buildconf run the buildconf in the ares dir if that diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 31c79fc12..d25be6851 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -15,6 +15,8 @@ This release includes the following changes: This release includes the following bugfixes: + o Doing a second request with FTP on the same bath path, would make libcurl + confuse what current working directory it had o FTP over HTTP proxy now sends the second CONNECT properly o numerous compiler warnings and build quirks for various compilers have been addressed @@ -31,6 +33,6 @@ This release would not have looked like this without help, code, reports and advice from friends like these: Dov Murik, Jean Jacques Drouin, Andres Garcia, Yang Tse, Gisle Vanem, Dan - Fandrich, Alexander Lazic, Mike Jean + Fandrich, Alexander Lazic, Michael Jahn Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/ftp.c b/lib/ftp.c index 6c35ce215..6bf96cde9 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -2529,6 +2529,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) else { /* return failure */ failf(data, "Server denied you to change to the given directory"); + ftp->cwdfail = TRUE; /* don't remember this path as we failed + to enter it */ return CURLE_FTP_ACCESS_DENIED; } } @@ -2815,7 +2817,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status) flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */ dlen = strlen(path)-flen; - if(dlen) { + if(dlen && !ftp->cwdfail) { ftp->prevpath = path; if(flen) /* if 'path' is not the whole string */ @@ -3664,6 +3666,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn) /* the ftp struct is already inited in ftp_connect() */ ftp = conn->proto.ftp; ftp->ctl_valid = FALSE; + ftp->cwdfail = FALSE; switch(data->set.ftp_filemethod) { case FTPFILE_NOCWD: diff --git a/lib/urldata.h b/lib/urldata.h index 3842952fe..0293dd5ad 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -343,6 +343,8 @@ struct FTP { should be FALSE when it gets to Curl_ftp_quit() */ bool cwddone; /* if it has been determined that the proper CWD combo already has been done */ + bool cwdfail; /* set TRUE if a CWD command fails, as then we must prevent + caching the current directory */ char *prevpath; /* conn->path from the previous transfer */ size_t nread_resp; /* number of bytes currently read of a server response */