clean up the dir tree hierarchy in *_done() to make persistant connection
authorDaniel Stenberg <daniel@haxx.se>
Tue, 5 Aug 2003 13:04:10 +0000 (13:04 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 5 Aug 2003 13:04:10 +0000 (13:04 +0000)
FTP use the correct directories!

Reported in bug report #783116

lib/ftp.c

index bfe6e7a4662f07516dc9be9af618a4c594e8aaca..6acab245b0200c2bc5decbccd6f7c4498d56bf48 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -105,6 +105,15 @@ static CURLcode ftp_cwd(struct connectdata *conn, char *path);
 /* easy-to-use macro: */
 #define FTPSENDF(x,y,z) if((result = Curl_ftpsendf(x,y,z))) return result
 
+static void freedirs(struct FTP *ftp)
+{
+  int i;
+  for (i=0; ftp->dirs[i]; i++){
+    free(ftp->dirs[i]);
+    ftp->dirs[i]=NULL;
+  }
+}
+
 /***********************************************************************
  *
  * AllowServerConnect()
@@ -598,6 +607,14 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
   int ftpcode;
   CURLcode result=CURLE_OK;
 
+  /* free the dir tree parts */
+  freedirs(ftp);
+
+  if(ftp->file) {
+    free(ftp->file);
+    ftp->file = NULL;
+  }
+
   if(data->set.upload) {
     if((-1 != data->set.infilesize) &&
        (data->set.infilesize != *ftp->bytecountp) &&
@@ -2161,7 +2178,8 @@ CURLcode Curl_ftp(struct connectdata *conn)
     
       if (!ftp->dirs[path_part]) { /* run out of memory ... */
         failf(data, "no memory");
-        retcode = CURLE_OUT_OF_MEMORY;
+        freedirs(ftp);
+        return CURLE_OUT_OF_MEMORY;
       }
     }
     else {
@@ -2175,17 +2193,10 @@ CURLcode Curl_ftp(struct connectdata *conn)
         /* too deep, we need the last entry to be kept NULL at all
            times to signal end of list */
         failf(data, "too deep dir hierarchy");
-        retcode = CURLE_URL_MALFORMAT;
+        freedirs(ftp);
+        return CURLE_URL_MALFORMAT;
       }
     }
-    if (retcode) {
-      int i;
-      for (i=0;i<path_part;i++) { /* free previous parts */
-        free(ftp->dirs[i]);
-        ftp->dirs[i]=NULL;
-      }
-      return retcode; /* failure */
-    }
   }
 
   ftp->file = cur_pos;  /* the rest is the file name */
@@ -2193,11 +2204,7 @@ CURLcode Curl_ftp(struct connectdata *conn)
   if(*ftp->file) {
     ftp->file = curl_unescape(ftp->file, 0);
     if(NULL == ftp->file) {
-      int i;
-      for (i=0;i<path_part;i++){
-        free(ftp->dirs[i]);
-        ftp->dirs[i]=NULL;
-      }
+      freedirs(ftp);
       failf(data, "no memory");
       return CURLE_OUT_OF_MEMORY;
     }
@@ -2288,22 +2295,20 @@ CURLcode Curl_ftpsendf(struct connectdata *conn,
 CURLcode Curl_ftp_disconnect(struct connectdata *conn)
 {
   struct FTP *ftp= conn->proto.ftp;
-  int i;
 
   /* The FTP session may or may not have been allocated/setup at this point! */
   if(ftp) {
     if(ftp->entrypath)
       free(ftp->entrypath);
-    if(ftp->cache)
+    if(ftp->cache) {
       free(ftp->cache);
-    if(ftp->file)
+      ftp->cache = NULL;
+    }
+    if(ftp->file) {
       free(ftp->file);
-    for (i=0;ftp->dirs[i];i++){
-      free(ftp->dirs[i]);
-      ftp->dirs[i]=NULL;
+      ftp->file = NULL; /* zero */
     }
-
-    ftp->file = NULL; /* zero */
+    freedirs(ftp);
   }
   return CURLE_OK;
 }