summaryrefslogtreecommitdiff
path: root/tests/libtest/lib539.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2008-07-07 20:37:07 +0000
committerDaniel Stenberg <daniel@haxx.se>2008-07-07 20:37:07 +0000
commit0e5da5b8bc8861f4c21521d154c4ef5d3cd96609 (patch)
treed03cdf9eb607fe685130a03ff43bc64b61ede3e1 /tests/libtest/lib539.c
parentddfa4b889681131bf19c8a911e9b376e14380551 (diff)
downloadcurl-0e5da5b8bc8861f4c21521d154c4ef5d3cd96609.tar.gz
- Scott Barrett provided a test case for a segfault in the FTP code and the
fix for it. It occured when you did a FTP transfer using CURLFTPMETHOD_SINGLECWD and then did another one on the same easy handle but switched to CURLFTPMETHOD_NOCWD. Due to the "dir depth" variable not being cleared properly. Scott's test case is now known as test 539 and it verifies the fix.
Diffstat (limited to 'tests/libtest/lib539.c')
-rw-r--r--tests/libtest/lib539.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/libtest/lib539.c b/tests/libtest/lib539.c
new file mode 100644
index 000000000..0e43654ef
--- /dev/null
+++ b/tests/libtest/lib539.c
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * $Id$
+ */
+
+#include "test.h"
+
+int test(char *URL)
+{
+ CURLcode res;
+ CURL *curl;
+ char *newURL;
+ struct curl_slist *slist;
+
+ if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ if ((curl = curl_easy_init()) == NULL) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ /*
+ * Begin with cURL set to use a single CWD to the URL's directory.
+ */
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_SINGLECWD);
+
+ res = curl_easy_perform(curl);
+
+ /*
+ * Change the FTP_FILEMETHOD option to use full paths rather than a CWD
+ * command. Alter the URL's path a bit, appending a "./". Use an innocuous
+ * QUOTE command, after which cURL will CWD to ftp_conn->entrypath and then
+ * (on the next call to ftp_statemach_act) find a non-zero ftpconn->dirdepth
+ * even though no directories are stored in the ftpconn->dirs array (after a
+ * call to freedirs).
+ */
+ newURL = strcat (strcpy ((char*)malloc (strlen (URL) + 3),
+ URL),
+ "./");
+ slist = curl_slist_append (NULL, "SYST");
+
+ curl_easy_setopt(curl, CURLOPT_URL, newURL);
+ curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_NOCWD);
+ curl_easy_setopt(curl, CURLOPT_QUOTE, slist);
+
+ res = curl_easy_perform(curl);
+
+ curl_slist_free_all(slist);
+ free(newURL);
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+
+ return (int)res;
+}