From 74a6921bc454fcbf842a221e95ba5dc09b19049e Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Fri, 18 Aug 2006 23:17:33 +0000
Subject: [PATCH] Armel Asselin fixed a crash in the FTP code when using
 SINGLECWD mode and files in the root directory.

---
 CHANGES       | 3 +++
 RELEASE-NOTES | 2 ++
 lib/ftp.c     | 9 +++++----
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/CHANGES b/CHANGES
index bacba4bd8b..74c321984f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,9 @@
                                   Changelog
 
 Daniel (19 August 2006)
+- Armel Asselin fixed a crash in the FTP code when using SINGLECWD mode and
+  files in the root directory.
+
 - Andrew Biggs pointed out a "Expect: 100-continue" flaw where libcurl didn't
   send the whole request at once, even though the Expect: header was disabled
   by the application. An effect of this change is also that small (< 1024
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 1f90ffe89e..49698e5245 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -15,6 +15,8 @@ This release includes the following changes:
 
 This release includes the following bugfixes:
 
+ o SINGLECWD mode and using files in the root dir
+ o Expect: header disabling work better
  o "Expect: 100-continue" disable on second POST on re-used connection
  o src/config.h.in is fixed
 
diff --git a/lib/ftp.c b/lib/ftp.c
index a52ad56a84..e7d8b2269a 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -3804,19 +3804,20 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
   case FTPFILE_SINGLECWD:
     /* get the last slash */
     slash_pos=strrchr(cur_pos, '/');
-    if(slash_pos) {
+    if(slash_pos || !cur_pos || !*cur_pos) {
       ftp->dirdepth = 1; /* we consider it to be a single dir */
       ftp->dirs = (char **)calloc(1, sizeof(ftp->dirs[0]));
       if(!ftp->dirs)
         return CURLE_OUT_OF_MEMORY;
 
-      ftp->dirs[0] = curl_easy_unescape(conn->data, cur_pos,
-                                        (int)(slash_pos-cur_pos), NULL);
+      ftp->dirs[0] = curl_easy_unescape(conn->data, slash_pos ? cur_pos : "/",
+                                        slash_pos?(int)(slash_pos-cur_pos):1,
+                                        NULL);
       if(!ftp->dirs[0]) {
         free(ftp->dirs);
         return CURLE_OUT_OF_MEMORY;
       }
-      ftp->file = slash_pos+1;  /* the rest is the file name */
+      ftp->file = slash_pos ? slash_pos+1 : cur_pos; /* rest is file name */
     }
     else
       ftp->file = cur_pos;  /* this is a file name only */
-- 
GitLab