diff --git a/lib/ftp.c b/lib/ftp.c
index dce23de751..5308b2fa21 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -4316,13 +4316,17 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
}
slash_pos=strrchr(cur_pos, '/');
if(slash_pos || !*cur_pos) {
+ size_t dirlen = slash_pos-cur_pos;
+
ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
if(!ftpc->dirs)
return CURLE_OUT_OF_MEMORY;
+ if(!dirlen)
+ dirlen++;
+
ftpc->dirs[0] = curl_easy_unescape(conn->data, slash_pos ? cur_pos : "/",
- slash_pos ?
- curlx_sztosi(slash_pos-cur_pos) : 1,
+ slash_pos ? curlx_sztosi(dirlen) : 1,
NULL);
if(!ftpc->dirs[0]) {
freedirs(ftpc);
@@ -4377,6 +4381,15 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
}
else {
cur_pos = slash_pos + 1; /* jump to the rest of the string */
+ if(!ftpc->dirdepth) {
+ /* path starts with a slash, add that as a directory */
+ ftpc->dirs[ftpc->dirdepth] = strdup("/");
+ if(!ftpc->dirs[ftpc->dirdepth++]) { /* run out of memory ... */
+ failf(data, "no memory");
+ freedirs(ftpc);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ }
continue;
}
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index d96ac02c77..c3857d2f5e 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -90,7 +90,7 @@ test1128 test1129 test1130 test1131 test1132 test1133 \
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 \
-test1220 test1221 test1222 test1223 \
+test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
\
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
diff --git a/tests/data/test106 b/tests/data/test106
index d1b9a81b90..56eca64205 100644
--- a/tests/data/test106
+++ b/tests/data/test106
@@ -39,7 +39,8 @@ FTP GET with type=A style ASCII URL using %20 codes
USER anonymous
PASS ftp@example.com
PWD
-CWD /path with spaces
+CWD /
+CWD path with spaces
CWD and things2
EPSV
TYPE A
diff --git a/tests/data/test1224 b/tests/data/test1224
new file mode 100644
index 0000000000..315936b99e
--- /dev/null
+++ b/tests/data/test1224
@@ -0,0 +1,49 @@
+
+
+
+FTP
+PASV
+RETR
+
+
+# Server-side
+
+
+data
+ to
+ see
+that FTP
+works
+ so does it?
+
+
+
+# Client-side
+
+
+ftp
+
+
+FTP fetch a file from the root directory
+
+
+ftp://%HOSTIP:%FTPPORT//1224
+
+
+
+
+# Verify data after the test has been "shot"
+
+
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD /
+EPSV
+TYPE I
+SIZE 1224
+RETR 1224
+QUIT
+
+
+
diff --git a/tests/data/test1225 b/tests/data/test1225
new file mode 100644
index 0000000000..2b2519c948
--- /dev/null
+++ b/tests/data/test1225
@@ -0,0 +1,57 @@
+
+
+
+FTP
+PASV
+RETR
+
+
+# Server-side
+
+
+data
+ to
+ see
+that FTP
+works
+ so does it?
+
+
+
+# Client-side
+
+
+ftp
+
+
+FTP fetch two files using absolute paths
+
+
+ftp://%HOSTIP:%FTPPORT//foo/1225 ftp://%HOSTIP:%FTPPORT//foo/bar/1225
+
+
+
+
+# Verify data after the test has been "shot"
+
+
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD /
+CWD foo
+EPSV
+TYPE I
+SIZE 1225
+RETR 1225
+CWD /
+CWD /
+CWD foo
+CWD bar
+EPSV
+SIZE 1225
+RETR 1225
+QUIT
+
+
+
diff --git a/tests/data/test1226 b/tests/data/test1226
new file mode 100644
index 0000000000..6381b122a4
--- /dev/null
+++ b/tests/data/test1226
@@ -0,0 +1,49 @@
+
+
+
+FTP
+PASV
+RETR
+
+
+# Server-side
+
+
+data
+ to
+ see
+that FTP
+works
+ so does it?
+
+
+
+# Client-side
+
+
+ftp
+
+
+FTP fetch a file from the root directory with singlecwd
+
+
+ftp://%HOSTIP:%FTPPORT//1226 --ftp-method singlecwd
+
+
+
+
+# Verify data after the test has been "shot"
+
+
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD /
+EPSV
+TYPE I
+SIZE 1226
+RETR 1226
+QUIT
+
+
+
diff --git a/tests/data/test1227 b/tests/data/test1227
new file mode 100644
index 0000000000..46b28d510b
--- /dev/null
+++ b/tests/data/test1227
@@ -0,0 +1,48 @@
+
+
+
+FTP
+PASV
+RETR
+
+
+# Server-side
+
+
+data
+ to
+ see
+that FTP
+works
+ so does it?
+
+
+
+# Client-side
+
+
+ftp
+
+
+FTP fetch a file from the root directory with nocwd
+
+
+ftp://%HOSTIP:%FTPPORT//1227 --ftp-method nocwd
+
+
+
+
+# Verify data after the test has been "shot"
+
+
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE /1227
+RETR /1227
+QUIT
+
+
+