diff --git a/CHANGES b/CHANGES index eadf532ca..3d4674b25 100644 --- a/CHANGES +++ b/CHANGES @@ -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(). diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 9ecb0f1dd..cac8b06d9 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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: diff --git a/lib/ftp.c b/lib/ftp.c index 0ec524336..f821d124d 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -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 @@ -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; } @@ -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; } diff --git a/tests/data/test227 b/tests/data/test227 index 55a24e108..523fa0253 100644 --- a/tests/data/test227 +++ b/tests/data/test227 @@ -19,6 +19,7 @@ works REPLY EPSV 500 no such command +REPLY FAIL 500 this might not be a failure! @@ -31,7 +32,7 @@ ftp FTP with quote ops -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" @@ -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