1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

ftp: make a 552 response return CURLE_REMOTE_DISK_FULL

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
This commit is contained in:
Daniel Stenberg 2020-09-25 17:13:42 +02:00
parent 7772344e17
commit 4a4c724599
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
5 changed files with 89 additions and 3 deletions

View File

@ -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;
}
}
}

View 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

View 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 \

61
tests/data/test348 Normal file
View File

@ -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
PASS ftp@example.com
PWD
EPSV
TYPE I
STOR 348
QUIT
</protocol>
# 70 - CURLE_REMOTE_DISK_FULL
<errorcode>
70
</errorcode>
</verify>
</testcase>

View File

@ -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);