1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel (at) haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 #include "test.h" 23 24 #include "memdebug.h" 25 26 int test(char *URL) 27 { 28 CURLcode res; 29 CURL *curl; 30 char *newURL = NULL; 31 struct curl_slist *slist = NULL; 32 33 if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 34 fprintf(stderr, "curl_global_init() failed\n"); 35 return TEST_ERR_MAJOR_BAD; 36 } 37 38 if((curl = curl_easy_init()) == NULL) { 39 fprintf(stderr, "curl_easy_init() failed\n"); 40 curl_global_cleanup(); 41 return TEST_ERR_MAJOR_BAD; 42 } 43 44 /* 45 * Begin with curl set to use a single CWD to the URL's directory. 46 */ 47 test_setopt(curl, CURLOPT_URL, URL); 48 test_setopt(curl, CURLOPT_VERBOSE, 1L); 49 test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD); 50 51 res = curl_easy_perform(curl); 52 53 /* 54 * Change the FTP_FILEMETHOD option to use full paths rather than a CWD 55 * command. Alter the URL's path a bit, appending a "./". Use an innocuous 56 * QUOTE command, after which curl will CWD to ftp_conn->entrypath and then 57 * (on the next call to ftp_statemach_act) find a non-zero ftpconn->dirdepth 58 * even though no directories are stored in the ftpconn->dirs array (after a 59 * call to freedirs). 60 */ 61 newURL = aprintf("%s./", URL); 62 if(newURL == NULL) { 63 curl_easy_cleanup(curl); 64 curl_global_cleanup(); 65 return TEST_ERR_MAJOR_BAD; 66 } 67 68 slist = curl_slist_append (NULL, "SYST"); 69 if(slist == NULL) { 70 free(newURL); 71 curl_easy_cleanup(curl); 72 curl_global_cleanup(); 73 return TEST_ERR_MAJOR_BAD; 74 } 75 76 test_setopt(curl, CURLOPT_URL, newURL); 77 test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD); 78 test_setopt(curl, CURLOPT_QUOTE, slist); 79 80 res = curl_easy_perform(curl); 81 82 test_cleanup: 83 84 curl_slist_free_all(slist); 85 free(newURL); 86 curl_easy_cleanup(curl); 87 curl_global_cleanup(); 88 89 return (int)res; 90 } 91