diff options
author | Daniel Stenberg <daniel@haxx.se> | 2004-04-22 13:09:00 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2004-04-22 13:09:00 +0000 |
commit | 1d3f76df714556ce07f70470947fe36dd9fc733e (patch) | |
tree | 8af2217c440c6ec864782801976e8453e684eed7 | |
parent | 33cb93ad0bf93879b5aaff76bef2c9a69b8ab985 (diff) |
If only a partial file was transfered, we consider that a fatal problem so
we won't try to QUIT the control connection and risk "hanging" waiting for
a response. Test case 161 verifies this. The quit-sending function was
also made static.
-rw-r--r-- | lib/ftp.c | 49 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test161 | 39 | ||||
-rwxr-xr-x | tests/memanalyze.pl | 5 |
4 files changed, 73 insertions, 22 deletions
@@ -117,6 +117,7 @@ static CURLcode ftp_sendquote(struct connectdata *conn, static CURLcode ftp_cwd(struct connectdata *conn, char *path); static CURLcode ftp_mkd(struct connectdata *conn, char *path); static CURLcode ftp_cwd_and_mkd(struct connectdata *conn, char *path); +static CURLcode ftp_quit(struct connectdata *conn); /* easy-to-use macro: */ #define FTPSENDF(x,y,z) if((result = Curl_ftpsendf(x,y,z))) return result @@ -604,22 +605,22 @@ CURLcode Curl_ftp_connect(struct connectdata *conn) infof(data, "We have successfully logged in\n"); if (conn->ssl[FIRSTSOCKET].use) { #ifdef HAVE_KRB4 - /* we are logged in (with Kerberos) - * now set the requested protection level - */ - if(conn->sec_complete) - Curl_sec_set_protection_level(conn); - - /* we may need to issue a KAUTH here to have access to the files - * do it if user supplied a password - */ - if(conn->passwd && *conn->passwd) { - result = Curl_krb_kauth(conn); - if(result) - return result; - } + /* We are logged in with Kerberos, now set the requested protection + * level + */ + if(conn->sec_complete) + Curl_sec_set_protection_level(conn); + + /* We may need to issue a KAUTH here to have access to the files + * do it if user supplied a password + */ + if(conn->passwd && *conn->passwd) { + result = Curl_krb_kauth(conn); + if(result) + return result; + } #endif - } + } } else { failf(data, "Odd return code after USER"); @@ -743,10 +744,13 @@ CURLcode Curl_ftp_done(struct connectdata *conn) ssize_t nread; int ftpcode; CURLcode result=CURLE_OK; + bool was_ctl_valid = ftp->ctl_valid; /* free the dir tree and file parts */ freedirs(ftp); + ftp->ctl_valid = FALSE; + if(data->set.upload) { if((-1 != data->set.infilesize) && (data->set.infilesize != *ftp->bytecountp) && @@ -779,6 +783,8 @@ CURLcode Curl_ftp_done(struct connectdata *conn) result = CURLE_FTP_COULDNT_RETR_FILE; } } + + ftp->ctl_valid = was_ctl_valid; #ifdef HAVE_KRB4 Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]); @@ -2312,7 +2318,7 @@ CURLcode ftp_perform(struct connectdata *conn, * The input argument is already checked for validity. * * ftp->ctl_valid starts out as FALSE, and gets set to TRUE if we reach the - * end of the function. + * Curl_ftp_done() function without finding any major problem. */ CURLcode Curl_ftp(struct connectdata *conn) { @@ -2419,7 +2425,8 @@ CURLcode Curl_ftp(struct connectdata *conn) else freedirs(ftp); - ftp->ctl_valid = TRUE; + ftp->ctl_valid = TRUE; /* seems good */ + return retcode; } @@ -2474,7 +2481,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, /*********************************************************************** * - * Curl_ftp_quit() + * ftp_quit() * * This should be called before calling sclose() on an ftp control connection * (not data connections). We should then wait for the response from the @@ -2482,7 +2489,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, * connection. * */ -CURLcode Curl_ftp_quit(struct connectdata *conn) +static CURLcode ftp_quit(struct connectdata *conn) { ssize_t nread; int ftpcode; @@ -2512,13 +2519,13 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn) bad in any way, sending quit and waiting around here will make the disconnect wait in vain and cause more problems than we need to. - Curl_ftp_quit() will check the state of ftp->ctl_valid. If it's ok it + ftp_quit() will check the state of ftp->ctl_valid. If it's ok it will try to send the QUIT command, otherwise it will just return. */ /* The FTP session may or may not have been allocated/setup at this point! */ if(ftp) { - (void)Curl_ftp_quit(conn); /* ignore errors on the QUIT */ + (void)ftp_quit(conn); /* ignore errors on the QUIT */ if(ftp->entrypath) free(ftp->entrypath); diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 5012165e3..39c807a39 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -22,7 +22,7 @@ test80 test81 test82 test83 test84 test85 test86 test87 test507 \ test149 test88 test89 test90 test508 test91 test92 test203 test93 \ test94 test95 test509 test510 test97 test98 test99 test150 test151 \ test152 test153 test154 test155 test156 test157 test158 test159 test511 \ -test160 +test160 test161 # The following tests have been removed from the dist since they no longer # work. We need to fix the test suite's FTPS server first, then bring them diff --git a/tests/data/test161 b/tests/data/test161 new file mode 100644 index 000000000..c3bda556f --- /dev/null +++ b/tests/data/test161 @@ -0,0 +1,39 @@ +# Server-side +<reply> +<data> +1oooooooooooooooooooooooooooooooooooooooooo2 +</data> +<size> +10928 +</size> +</reply> + +# Client-side +<client> +<server> +ftp +</server> + <name> +FTP RETR PASV + </name> + <command> +ftp://%HOSTIP:%FTPPORT/161 +</command> +</test> + + +# Verify data after the test has been "shot" +<verify> +<protocol> +USER anonymous
+PASS curl_by_daniel@haxx.se
+PWD
+EPSV
+TYPE I
+SIZE 161
+RETR 161
+</protocol> +<errorcode> +18 +</errrorcode> +</verify> diff --git a/tests/memanalyze.pl b/tests/memanalyze.pl index b15e43d78..eaa8b5fe9 100755 --- a/tests/memanalyze.pl +++ b/tests/memanalyze.pl @@ -258,6 +258,11 @@ while(<FILE>) { } } } + # GETNAME url.c:1901 getnameinfo() + elsif($_ =~ /^GETNAME ([^ ]*):(\d*) (.*)/) { + # not much to do + } + # ADDR url.c:1282 getaddrinfo() = 0x5ddd elsif($_ =~ /^ADDR ([^ ]*):(\d*) (.*)/) { # generic match for the filename+linenumber |