Skip to content

Commit

Permalink
FTP quote commands prefixed with '*' now can fail without aborting
Browse files Browse the repository at this point in the history
Prefixing the FTP quote commands with an asterisk really only
worked for the postquote actions. This is now fixed and test case
227 has been extended to verify.
  • Loading branch information
bagder committed Apr 9, 2010
1 parent 10977f5 commit 02892e4
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
5 changes: 5 additions & 0 deletions CHANGES
Expand Up @@ -6,6 +6,11 @@

Changelog

Daniel Stenberg (9 Apr 2010)
- Prefixing the FTP quote commands with an asterisk really only worked for the
postquote actions. This is now fixed and test case 227 has been extended to
verify.

Kamil Dudka (4 Apr 2010)
- Eliminated a race condition in Curl_resolv_timeout().

Expand Down
1 change: 1 addition & 0 deletions RELEASE-NOTES
Expand Up @@ -45,6 +45,7 @@ This release includes the following bugfixes:
o RTSP GET_PARAMETER
o timeout after last data chunk was handled
o SFTP download hang
o FTP quote commands prefixed with '*' now can fail without aborting

This release includes the following known bugs:

Expand Down
19 changes: 17 additions & 2 deletions lib/ftp.c
Expand Up @@ -1424,6 +1424,12 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
break;
}

/*
* This state uses:
* 'count1' to iterate over the commands to send
* 'count2' to store wether to allow commands to fail
*/

if(init)
ftpc->count1 = 0;
else
Expand All @@ -1438,7 +1444,15 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
i++;
}
if(item) {
PPSENDF(&ftpc->pp, "%s", item->data);
char *cmd = item->data;
if(cmd[0] == '*') {
cmd++;
ftpc->count2 = 1; /* the sent command is allowed to fail */
}
else
ftpc->count2 = 0; /* failure means cancel operation */

PPSENDF(&ftpc->pp, "%s", cmd);
state(conn, instate);
quote = TRUE;
}
Expand Down Expand Up @@ -2658,7 +2672,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
case FTP_POSTQUOTE:
case FTP_RETR_PREQUOTE:
case FTP_STOR_PREQUOTE:
if(ftpcode >= 400) {
if((ftpcode >= 400) && !ftpc->count2) {
/* failure reponse code, and not allowed to fail */
failf(conn->data, "QUOT command failed with %03d", ftpcode);
return CURLE_QUOTE_ERROR;
}
Expand Down
5 changes: 4 additions & 1 deletion tests/data/test227
Expand Up @@ -19,6 +19,7 @@ works
</data>
<servercmd>
REPLY EPSV 500 no such command
REPLY FAIL 500 this might not be a failure!
</servercmd>
</reply>

Expand All @@ -31,7 +32,7 @@ ftp
FTP with quote ops
</name>
<command>
ftp://%HOSTIP:%FTPPORT/227 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3"
ftp://%HOSTIP:%FTPPORT/227 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3" -Q "*FAIL" -Q "+*FAIL HARD"
</command>
</client>

Expand All @@ -42,10 +43,12 @@ USER anonymous
PASS ftp@example.com
PWD
NOOP 1
FAIL
EPSV
PASV
TYPE I
NOOP 2
FAIL HARD
SIZE 227
RETR 227
NOOP 3
Expand Down

0 comments on commit 02892e4

Please sign in to comment.