diff --git a/CHANGES b/CHANGES index 1e466d59c36cbe16461e9311586fcf7a433117f4..b4d6554d2fcc79db80cd85442ad281c706da5d9c 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,18 @@ Changelog Daniel Stenberg (8 Dec 2008) +- Fred Machado posted about a weird FTP problem on the curl-users list and when + researching it, it turned out he got a 550 response back from a SIZE command + and then I fell over the text in RFC3659 that says: + + The presence of the 550 error response to a SIZE command MUST NOT be taken + by the client as an indication that the file cannot be transferred in the + current MODE and TYPE. + + In other words: the change I did on September 30th 2008 and that has been + included in the last two releases were a regression and a bad idea. We MUST + NOT take a 550 response from SIZE as a hint that the file doesn't exist. + - Christian Krause filed bug #2221237 (http://curl.haxx.se/bug/view.cgi?id=2221237) that identified an infinite loop during GSS authentication given some specific conditions. With his diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 0cc307b02e0583a4db4eb7052d0136fb0ae8b83d..cf34cf41dd489acc59fc9142bae565e805cc3cfb 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -25,6 +25,7 @@ This release includes the following bugfixes: o bad fclose() after a fatal error in cookie code o curl_multi_remove_handle() when the handle was in use in a HTTP pipeline o GSS authentication infinite loop problem + o 550 response from SIZE no longer treated as missing file This release includes the following known bugs: @@ -34,6 +35,7 @@ This release would not have looked like this without help, code, reports and advice from friends like these: Yang Tse, Daniel Fandrich, Jim Meyering, Christian Krause, Andreas Wurf, - Markus Koetter, Josef Wolf, Vlad Grachov, Pawel Kierski, Igor Novoseltsev + Markus Koetter, Josef Wolf, Vlad Grachov, Pawel Kierski, Igor Novoseltsev, + Fred Machado Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/ftp.c b/lib/ftp.c index 547ad77d973762c7e79ea7c07d7482cbb1ab8c2a..209faf7d7d5dc70a9ea68558d7ff3414b8d22d6e 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -2190,10 +2190,6 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn, curl_off_t filesize; char *buf = data->state.buffer; - if((instate != FTP_STOR_SIZE) && (ftpcode == 550)) - /* the file doesn't exist and we're not about to upload */ - return CURLE_REMOTE_FILE_NOT_FOUND; - /* get the size from the ascii string: */ filesize = (ftpcode == 213)?curlx_strtoofft(buf+4, NULL, 0):-1; @@ -3169,7 +3165,6 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, case CURLE_UPLOAD_FAILED: case CURLE_REMOTE_ACCESS_DENIED: case CURLE_FILESIZE_EXCEEDED: - case CURLE_REMOTE_FILE_NOT_FOUND: /* the connection stays alive fine even though this happened */ /* fall-through */ case CURLE_OK: /* doesn't affect the control connection's status */ diff --git a/tests/data/test118 b/tests/data/test118 index b2b10c2355e54ca1c7f2b3525e097c48cf673669..6cd086ca239b839c9a7d9ee17fad96ea655f03d6 100644 --- a/tests/data/test118 +++ b/tests/data/test118 @@ -9,9 +9,6 @@ FAILURE </info> # Server-side <reply> -<size> -1 -</size> <servercmd> REPLY RETR 314 bluah you f00l! REPLY EPSV 314 bluah you f00l! diff --git a/tests/data/test533 b/tests/data/test533 index a7a57b9a7346a20e5153ff43ff3a251fb71f798c..f4446cbe0058db0c0ec334279f8d7e1b72f602a9 100644 --- a/tests/data/test533 +++ b/tests/data/test533 @@ -45,8 +45,10 @@ CWD path EPSV TYPE I SIZE 533 +RETR 533 EPSV SIZE 533 +RETR 533 QUIT </protocol> </verify> diff --git a/tests/data/test534 b/tests/data/test534 index 1f02df5519844b481f8597723cd0b3fbd72938c8..52bb1e2604f8703e398ce3f5d409cbd32196d9fa 100644 --- a/tests/data/test534 +++ b/tests/data/test534 @@ -45,6 +45,7 @@ CWD path EPSV TYPE I SIZE 534 +RETR 534 QUIT </protocol> </verify> diff --git a/tests/data/test546 b/tests/data/test546 index 415848792c22f45c9257b9272d13daaf070e1300..1dd1cd41e44bef1df1b476cd489f026cc818fd15 100644 --- a/tests/data/test546 +++ b/tests/data/test546 @@ -19,6 +19,8 @@ works </data> <servercmd> +REPLY RETR 550 the file doesn't exist +COUNT RETR 1 REPLY SIZE 550 Can't check for file existence COUNT SIZE 1 </servercmd> @@ -50,6 +52,7 @@ CWD path EPSV TYPE I SIZE 546 +RETR 546 EPSV SIZE 546 RETR 546 diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 7a2ffe5299d1bdd5a55ad7eb63b12c308358d433..f2acd72d8b3faeb067b0a2867d85dbd6afae7c8f 100644 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -407,14 +407,12 @@ sub SIZE_command { my $size = $data[0]; - if($size ne "") { - # we check for "" to be able to explictly set the size to 0 and yet have - # that send a 213 + if($size) { if($size > -1) { sendcontrol "213 $size\r\n"; } else { - sendcontrol "350 $testno: SIZE is not supported.\r\n"; + sendcontrol "550 $testno: No such file or directory.\r\n"; } } else { @@ -427,7 +425,7 @@ sub SIZE_command { sendcontrol "213 $size\r\n"; } else { - sendcontrol "350 $testno: SIZE is not supported.\r\n"; + sendcontrol "550 $testno: No such file or directory.\r\n"; } } return 0;