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.
This commit is contained in:
Daniel Stenberg 2007-09-11 22:23:57 +00:00
parent 1ce732e9d6
commit 9e88343a17
6 changed files with 185 additions and 2 deletions

11
CHANGES
View File

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

View File

@ -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:

View File

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

51
tests/data/test541 Normal file
View File

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

View File

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

117
tests/libtest/lib541.c Normal file
View File

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