From 18371aaff999d4862a32d060f03d8f668e8fa1b1 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Mon, 8 Dec 2008 20:20:51 +0000
Subject: [PATCH] - 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.
---
 CHANGES            | 12 ++++++++++++
 RELEASE-NOTES      |  4 +++-
 lib/ftp.c          |  5 -----
 tests/data/test118 |  3 ---
 tests/data/test533 |  2 ++
 tests/data/test534 |  1 +
 tests/data/test546 |  3 +++
 tests/ftpserver.pl |  8 +++-----
 8 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/CHANGES b/CHANGES
index 1e466d59c3..b4d6554d2f 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 0cc307b02e..cf34cf41dd 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 547ad77d97..209faf7d7d 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 b2b10c2355..6cd086ca23 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 a7a57b9a73..f4446cbe00 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 1f02df5519..52bb1e2604 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 415848792c..1dd1cd41e4 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 7a2ffe5299..f2acd72d8b 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;
-- 
GitLab