Unverified Commit ecf21c55 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

FTP: URL decode path for dir listing in nocwd mode

Reported-by: Zenju on github

Test 244 added to verify
Fixes #1974
Closes #1976
parent 00fb811e
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -1457,25 +1457,22 @@ static CURLcode ftp_state_list(struct connectdata *conn)
     then just do LIST (in that case: nothing to do here)
  */
  char *cmd, *lstArg, *slashPos;
  const char *inpath = data->state.path;

  lstArg = NULL;
  if((data->set.ftp_filemethod == FTPFILE_NOCWD) &&
     data->state.path &&
     data->state.path[0] &&
     strchr(data->state.path, '/')) {

    lstArg = strdup(data->state.path);
    if(!lstArg)
      return CURLE_OUT_OF_MEMORY;
     inpath && inpath[0] && strchr(inpath, '/')) {
    size_t n = strlen(inpath);

    /* Check if path does not end with /, as then we cut off the file part */
    if(lstArg[strlen(lstArg) - 1] != '/') {

    if(inpath[n - 1] != '/') {
      /* chop off the file part if format is dir/dir/file */
      slashPos = strrchr(lstArg, '/');
      if(slashPos)
        *(slashPos + 1) = '\0';
      slashPos = strrchr(inpath, '/');
      n = slashPos - inpath;
    }
    result = Curl_urldecode(data, inpath, n, &lstArg, NULL, FALSE);
    if(result)
      return result;
  }

  cmd = aprintf("%s%s%s",
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ test208 test209 test210 test211 test212 test213 test214 test215 test216 \
test217 test218 test219 test220 test221 test222 test223 test224 test225 \
test226 test227 test228 test229         test231         test233 test234 \
test235 test236 test237 test238 test239 test240 test241 test242 test243 \
        test245 test246 test247 test248 test249 test250 test251 test252 \
test244 test245 test246 test247 test248 test249 test250 test251 test252 \
test253 test254 test255 test256 test257 test258 test259 test260 test261 \
test262 test263 test264 test265 test266 test267 test268 test269 test270 \
test271 test272 test273 test274 test275 test276 test277 test278 test279 \

tests/data/test244

0 → 100644
+54 −0
Original line number Diff line number Diff line
<testcase>
<info>
<keywords>
FTP
PASV
CWD
--ftp-method
nocwd
</keywords>
</info>
#
# Server-side
<reply>
<data mode="text">
total 20
drwxr-xr-x   8 98       98           512 Oct 22 13:06 .
drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..
drwxr-xr-x   2 98       98           512 May  2  1996 .NeXT
-r--r--r--   1 0        1             35 Jul 16  1996 README
lrwxrwxrwx   1 0        1              7 Dec  9  1999 bin -> usr/bin
dr-xr-xr-x   2 0        1            512 Oct  1  1997 dev
drwxrwxrwx   2 98       98           512 May 29 16:04 download.html
dr-xr-xr-x   2 0        1            512 Nov 30  1995 etc
drwxrwxrwx   2 98       1            512 Oct 30 14:33 pub
dr-xr-xr-x   5 0        1            512 Oct  1  1997 usr
</data>
</reply>

# Client-side
<client>
<server>
ftp
</server>
 <name>
FTP dir listing with nocwd and URL encoded path
 </name>
 <command>
--ftp-method nocwd ftp://%HOSTIP:%FTPPORT/fir%23t/th%69rd/244/
</command>
</client>

# Verify data after the test has been "shot"
<verify>
<protocol>
USER anonymous
PASS ftp@example.com
PWD
EPSV
TYPE A
LIST fir#t/third/244/
QUIT
</protocol>
</verify>
</testcase>