]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
ftp: make a 552 response return CURLE_REMOTE_DISK_FULL
authorDaniel Stenberg <daniel@haxx.se>
Fri, 25 Sep 2020 15:13:42 +0000 (17:13 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 26 Sep 2020 11:37:15 +0000 (13:37 +0200)
Added test 348 to verify. Added a 'STOR' command to the test FTP
server to enable test 348. Documented the command in FILEFORMAT.md

Reported-by: Duncan Wilcox
Fixes #6016
Closes #6017

lib/ftp.c
tests/FILEFORMAT.md
tests/data/Makefile.inc
tests/data/test348 [new file with mode: 0644]
tests/ftpserver.pl

index 3fd9cea2c4cd21e93ccf9fe1f5a825d84f65b5dd..11031da6fbc93416a9bc0c005938596770a0f98a 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -3292,9 +3292,18 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
 
     if(!ftpc->dont_check) {
       /* 226 Transfer complete, 250 Requested file action okay, completed. */
-      if((ftpcode != 226) && (ftpcode != 250)) {
+      switch(ftpcode) {
+      case 226:
+      case 250:
+        break;
+      case 552:
+        failf(data, "Exceeded storage allocation");
+        result = CURLE_REMOTE_DISK_FULL;
+        break;
+      default:
         failf(data, "server did not report OK, got %d", ftpcode);
         result = CURLE_PARTIAL_FILE;
+        break;
       }
     }
   }
index c8f7e8391c45927a55f1aedd1a2814776f626c5d..09600d016a89238a94952bbae6a290e0196dc599 100644 (file)
@@ -237,6 +237,7 @@ about to issue.
    POP3 `CAPA` and SMTP `EHLO` commands
 - `AUTH [mechanisms]` - Enables support for SASL authentication and specifies
    a list of space separated mechanisms for IMAP, POP3 and SMTP
+- `STOR [msg]` respond with this instead of default after `STOR`
 
 #### For HTTP/HTTPS
 
index b4774a5f7f2a0f1ec58553d4d9426e889fadbc18..35932d11b32cdf153d5f86dc4f869923bb19b277 100644 (file)
@@ -58,7 +58,7 @@ test307 test308 test309 test310 test311 test312 test313 test314 test315 \
 test316 test317 test318 test319 test320 test321 test322 test323 test324 \
 test325 test326 test327 test328 test329 test330 test331 test332 test333 \
 test334 test335 test336 test337 test338 test339 test340 test341 test342 \
-test343 test344 test345 test346 test347 \
+test343 test344 test345 test346 test347 test348 \
 test350 test351 test352 test353 test354 test355 test356 test357 test358 \
 test359 \
 test393 test394 test395 test396 test397 \
diff --git a/tests/data/test348 b/tests/data/test348
new file mode 100644 (file)
index 0000000..befd9fb
--- /dev/null
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+FTP
+EPSV
+STOR
+</keywords>
+</info>
+
+<reply>
+<servercmd>
+STOR 552 disk full
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP upload file with 552 disk full response
+ </name>
+<file name="log/test348.txt">
+data
+    to
+      see
+that FTP
+works
+  so does it?
+</file>
+ <command>
+ftp://%HOSTIP:%FTPPORT/348 -T log/test348.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<upload>
+data
+    to
+      see
+that FTP
+works
+  so does it?
+</upload>
+<protocol>
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+EPSV\r
+TYPE I\r
+STOR 348\r
+QUIT\r
+</protocol>
+# 70 - CURLE_REMOTE_DISK_FULL
+<errorcode>
+70
+</errorcode>
+</verify>
+</testcase>
index d587f453e36a123bbf2e2ca4605c0084cc504876..198ccd794445616053b0fc63941ae71e618326d8 100755 (executable)
@@ -145,6 +145,7 @@ my $nodataconn;    # set if ftp srvr doesn't establish or accepts data channel
 my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
 my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
 my $nodataconn150; # set if ftp srvr doesn't establish data ch and replies 150
+my $storeresp;
 my @capabilities;  # set if server supports capability commands
 my @auth_mechs;    # set if server supports authentication commands
 my %fulltextreply; #
@@ -2413,6 +2414,10 @@ sub STOR_ftp {
             logmsg "No support for: $line";
             last;
         }
+        if($storeresp) {
+            # abort early
+            last;
+        }
     }
     if($nosave) {
         print FILE "$ulsize bytes would've been stored here\n";
@@ -2420,7 +2425,12 @@ sub STOR_ftp {
     close(FILE);
     close_dataconn($disc);
     logmsg "received $ulsize bytes upload\n";
-    sendcontrol "226 File transfer complete\r\n";
+    if($storeresp) {
+        sendcontrol "$storeresp\r\n";
+    }
+    else {
+        sendcontrol "226 File transfer complete\r\n";
+    }
     return 0;
 }
 
@@ -2784,6 +2794,7 @@ sub customize {
     $nodataconn425 = 0; # default is to not send 425 without data channel
     $nodataconn421 = 0; # default is to not send 421 without data channel
     $nodataconn150 = 0; # default is to not send 150 without data channel
+    $storeresp = "";    # send as ultimate STOR response
     @capabilities = (); # default is to not support capability commands
     @auth_mechs = ();   # default is to not support authentication commands
     %fulltextreply = ();#
@@ -2866,6 +2877,10 @@ sub customize {
             logmsg "FTPD: instructed to use NODATACONN\n";
             $nodataconn=1;
         }
+        elsif($_ =~ /^STOR (.*)/) {
+            $storeresp=$1;
+            logmsg "FTPD: instructed to use respond to STOR with '$storeresp'\n";
+        }
         elsif($_ =~ /CAPA (.*)/) {
             logmsg "FTPD: instructed to support CAPABILITY command\n";
             @capabilities = split(/ (?!(?:[^" ]|[^"] [^"])+")/, $1);