]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Curl_ftp_disconnect() no longer relies on anything in the reqdata struct. That
authorDaniel Stenberg <daniel@haxx.se>
Wed, 24 Oct 2007 21:14:11 +0000 (21:14 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 24 Oct 2007 21:14:11 +0000 (21:14 +0000)
was even mentioned to be bad in a comment! Should make test 2000 and 2001 work
fine.

Also, freedirs() now take a ftp_conn struct pointer which saves some extra
unnecessary variable assignments.

lib/ftp.c

index d6626f600568118c4a14c7ecdfd1d0d8438bbcbe..6ae3f828805a12359a76899c931d21a52a41591d 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -259,10 +259,8 @@ const struct Curl_handler Curl_handler_ftps_proxy = {
  */
 #define CURL_FTP_HTTPSTYLE_HEAD 1
 
-static void freedirs(struct connectdata *conn)
+static void freedirs(struct ftp_conn *ftpc)
 {
-  struct ftp_conn *ftpc = &conn->proto.ftpc;
-
   int i;
   if(ftpc->dirs) {
     for (i=0; i < ftpc->dirdepth; i++){
@@ -3209,7 +3207,7 @@ static CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status,
     }
   }
   /* free the dir tree and file parts */
-  freedirs(conn);
+  freedirs(ftpc);
 
 #if defined(HAVE_KRB4) || defined(HAVE_GSSAPI)
   Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
@@ -3806,29 +3804,26 @@ static CURLcode Curl_ftp_disconnect(struct connectdata *conn)
   */
 
   /* The FTP session may or may not have been allocated/setup at this point! */
-  /* FIXME: checking for conn->data->reqdata.proto.ftp is not correct here,
-   * the reqdata structure could be used by another connection already */
-  if(conn->data->reqdata.proto.ftp) {
-    (void)ftp_quit(conn); /* ignore errors on the QUIT */
-
-    if(ftpc->entrypath) {
-      struct SessionHandle *data = conn->data;
-      if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
-        data->state.most_recent_ftp_entrypath = NULL;
-      }
-      free(ftpc->entrypath);
-      ftpc->entrypath = NULL;
-    }
-    if(ftpc->cache) {
-      free(ftpc->cache);
-      ftpc->cache = NULL;
-    }
-    freedirs(conn);
-    if(ftpc->prevpath) {
-      free(ftpc->prevpath);
-      ftpc->prevpath = NULL;
+  (void)ftp_quit(conn); /* ignore errors on the QUIT */
+
+  if(ftpc->entrypath) {
+    struct SessionHandle *data = conn->data;
+    if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
+      data->state.most_recent_ftp_entrypath = NULL;
     }
+    free(ftpc->entrypath);
+    ftpc->entrypath = NULL;
+  }
+  if(ftpc->cache) {
+    free(ftpc->cache);
+    ftpc->cache = NULL;
+  }
+  freedirs(ftpc);
+  if(ftpc->prevpath) {
+    free(ftpc->prevpath);
+    ftpc->prevpath = NULL;
   }
+
   return CURLE_OK;
 }
 
@@ -3900,7 +3895,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
                                          slash_pos?(int)(slash_pos-cur_pos):1,
                                          NULL);
       if(!ftpc->dirs[0]) {
-        freedirs(conn);
+        freedirs(ftpc);
         return CURLE_OUT_OF_MEMORY;
       }
       ftpc->dirdepth = 1; /* we consider it to be a single dir */
@@ -3941,12 +3936,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
             curl_easy_unescape(conn->data, cur_pos - absolute_dir, len, NULL);
           if (!ftpc->dirs[ftpc->dirdepth]) { /* run out of memory ... */
             failf(data, "no memory");
-            freedirs(conn);
+            freedirs(ftpc);
             return CURLE_OUT_OF_MEMORY;
           }
           if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
             free(ftpc->dirs[ftpc->dirdepth]);
-            freedirs(conn);
+            freedirs(ftpc);
             return CURLE_URL_MALFORMAT;
           }
         }
@@ -3962,7 +3957,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
           ftpc->diralloc *= 2; /* double the size each time */
           bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
           if(!bigger) {
-            freedirs(conn);
+            freedirs(ftpc);
             return CURLE_OUT_OF_MEMORY;
           }
           ftpc->dirs = (char **)bigger;
@@ -3975,12 +3970,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
   if(ftpc->file && *ftpc->file) {
     ftpc->file = curl_easy_unescape(conn->data, ftpc->file, 0, NULL);
     if(NULL == ftpc->file) {
-      freedirs(conn);
+      freedirs(ftpc);
       failf(data, "no memory");
       return CURLE_OUT_OF_MEMORY;
     }
     if (isBadFtpString(ftpc->file)) {
-      freedirs(conn);
+      freedirs(ftpc);
       return CURLE_URL_MALFORMAT;
     }
   }
@@ -4001,7 +3996,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
        strings */
     char *path = curl_easy_unescape(conn->data, data->reqdata.path, 0, NULL);
     if(!path) {
-      freedirs(conn);
+      freedirs(ftpc);
       return CURLE_OUT_OF_MEMORY;
     }
 
@@ -4106,7 +4101,7 @@ CURLcode ftp_regular_transfer(struct connectdata *conn,
       return result;
   }
   else
-    freedirs(conn);
+    freedirs(ftpc);
 
   return result;
 }