diff options
-rw-r--r-- | CHANGES | 11 | ||||
-rw-r--r-- | RELEASE-NOTES | 2 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test541 | 51 | ||||
-rw-r--r-- | tests/libtest/Makefile.am | 4 | ||||
-rw-r--r-- | tests/libtest/lib541.c | 117 |
6 files changed, 185 insertions, 2 deletions
@@ -6,6 +6,17 @@ Changelog +Daniel S (12 September 2007) +- Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed + out a problem with doing an empty upload over FTP on a re-used connection. + I added test case 541 to reproduce it and to verify the fix. + +- I noticed while writing test 541 that the FTP code wrongly did a CWD on the + second transfer as it didn't store and remember the "" path from the + previous transfer so it would instead CWD to the entry path as stored. This + worked, but did a superfluous command. Thus, test case 541 now also verifies + this fix. + Dan F (5 September 2007) - Added test case 1007 to test permission problem when uploading with TFTP (to validate bug #1790403). diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 7932b0310..c0400568c 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -50,6 +50,8 @@ This release includes the following bugfixes: o FTP NOBODY request on file crash o excessively long FTP server responses and response lines o file:// upload then FTP:// upload crash + o uploading empty file over FTP on re-used connection + o superfluous CWD command on re-used connections without used directories This release includes the following known bugs: diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 87e7c581f..9d818b85a 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -44,4 +44,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test409 test613 test614 test700 test701 test702 test704 test705 test703 \ test706 test707 test350 test351 test352 test353 test289 test540 test354 \ test231 test1000 test1001 test1002 test1003 test1004 test1005 test1006 \ - test615 test1007 + test615 test1007 test541 diff --git a/tests/data/test541 b/tests/data/test541 new file mode 100644 index 000000000..ce4c91116 --- /dev/null +++ b/tests/data/test541 @@ -0,0 +1,51 @@ +<testcase> +# Server-side +<reply> +</reply> + +# Client-side +<client> +<server> +ftp +</server> +# tool is what to use instead of 'curl' +<tool> +lib541 +</tool> + + <name> +FTP upload and upload same file again without rewind + </name> + <command> +ftp://%HOSTIP:%FTPPORT/541 log/upload541 +</command> +<file name="log/upload541"> +Contents +of +a file +to verify +ftp +upload + + +works? +</file> +</client> + +# Verify data after the test has been "shot" +<verify> +<upload> +</upload> +<protocol> +USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+STOR 541
+EPSV
+STOR 541
+QUIT
+</protocol> +</verify> +</testcase> diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am index c511a6e16..dc55afce7 100644 --- a/tests/libtest/Makefile.am +++ b/tests/libtest/Makefile.am @@ -47,7 +47,7 @@ SUPPORTFILES = first.c test.h noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \ lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \ lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \ - lib529 lib530 lib532 lib533 lib536 lib537 lib540 + lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 # Dependencies (may need to be overriden) LDADD = $(LIBDIR)/libcurl.la @@ -126,3 +126,5 @@ lib536_SOURCES = lib536.c $(SUPPORTFILES) $(TESTUTIL) lib537_SOURCES = lib537.c $(SUPPORTFILES) lib540_SOURCES = lib540.c $(SUPPORTFILES) + +lib541_SOURCES = lib541.c $(SUPPORTFILES) diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c new file mode 100644 index 000000000..3ab1e2595 --- /dev/null +++ b/tests/libtest/lib541.c @@ -0,0 +1,117 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + */ + +#include "setup.h" /* struct_stat etc. */ +#include "test.h" + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +/* + * Two FTP uploads, the second with no content sent. + */ + +int test(char *URL) +{ + CURL *curl; + CURLcode res = CURLE_OK; + FILE *hd_src ; + int hd ; + struct_stat file_info; + int error; + + if (!arg2) { + fprintf(stderr, "Usage: <url> <file-to-upload>\n"); + return -1; + } + + /* get the file size of the local file */ + hd = stat(arg2, &file_info); + if(hd == -1) { + /* can't open file, bail out */ + error = ERRNO; + fprintf(stderr, "stat() failed with error: %d %s\n", + error, strerror(error)); + fprintf(stderr, "WARNING: cannot open file %s\n", arg2); + return -1; + } + + if(! file_info.st_size) { + fprintf(stderr, "WARNING: file %s has no size!\n", arg2); + return -4; + } + + /* get a FILE * of the same file, could also be made with + fdopen() from the previous descriptor, but hey this is just + an example! */ + hd_src = fopen(arg2, "rb"); + if(NULL == hd_src) { + error = ERRNO; + fprintf(stderr, "fopen() failed with error: %d %s\n", + error, strerror(error)); + fprintf(stderr, "Error opening file: %s\n", arg2); + return -2; /* if this happens things are major weird */ + } + + if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + fprintf(stderr, "curl_global_init() failed\n"); + fclose(hd_src); + return TEST_ERR_MAJOR_BAD; + } + + /* get a curl handle */ + if ((curl = curl_easy_init()) == NULL) { + fprintf(stderr, "curl_easy_init() failed\n"); + curl_global_cleanup(); + fclose(hd_src); + return TEST_ERR_MAJOR_BAD; + } + + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ; + + /* enable verbose */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE) ; + + /* specify target */ + curl_easy_setopt(curl,CURLOPT_URL, URL); + + /* now specify which file to upload */ + curl_easy_setopt(curl, CURLOPT_INFILE, hd_src); + + /* Now run off and do what you've been told! */ + res = curl_easy_perform(curl); + + /* and now upload the exact same again, but without rewinding so it already + is at end of file */ + res = curl_easy_perform(curl); + + /* close the local file */ + fclose(hd_src); + + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return res; +} |