From 29d21bea18281c4588dcc2507e9659b3f13c3ec6 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Tue, 21 Nov 2000 19:04:25 +0000
Subject: [PATCH] bad directory name extractor fixed, now always free the file
 and directory very early, as that could leak memory before

---
 lib/ftp.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/lib/ftp.c b/lib/ftp.c
index 13262970cd..425b60cce3 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -129,7 +129,7 @@ struct curl_slist *curl_slist_append(struct curl_slist *list, char *data)
 	}
 	else {
 		fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
-		exit(-1);
+		return NULL;
 	}
 
 	if (list) {
@@ -584,11 +584,6 @@ CURLcode ftp_done(struct connectdata *conn)
     }
   }
 
-  if(ftp->file)
-    free(ftp->file);
-  if(ftp->dir)
-    free(ftp->dir);
-
   free(ftp);
   data->proto.ftp=NULL; /* it is gone */
 
@@ -1406,13 +1401,15 @@ CURLcode ftp(struct connectdata *conn)
      it */
   ftp->file = strrchr(conn->ppath, '/');
   if(ftp->file) {
+    if(ftp->file != conn->ppath)
+      dirlength=ftp->file-conn->ppath; /* don't count the traling slash */
+
     ftp->file++; /* point to the first letter in the file name part or
                     remain NULL */
   }
   else {
     ftp->file = conn->ppath; /* there's only a file part */
   }
-  dirlength=ftp->file-conn->ppath;
 
   if(*ftp->file) {
     ftp->file = curl_unescape(ftp->file, 0);
@@ -1440,6 +1437,14 @@ CURLcode ftp(struct connectdata *conn)
 
   retcode = _ftp(conn);
 
+  /* clean up here, success or error doesn't matter */
+  if(ftp->file)
+    free(ftp->file);
+  if(ftp->dir)
+    free(ftp->dir);
+
+  ftp->file = ftp->dir = NULL; /* zero */
+
   return retcode;
 }
 
-- 
GitLab