]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Revert "ftplistparser: keep state between invokes"
authorDaniel Stenberg <daniel@haxx.se>
Tue, 24 Apr 2018 06:19:54 +0000 (08:19 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 24 Apr 2018 06:19:54 +0000 (08:19 +0200)
This reverts commit abbc8457d85aca74b7cfda1d394b0844932b2934.

Caused fuzzer problems on travis not seen when this was a PR!

lib/fileinfo.c
lib/fileinfo.h
lib/ftp.c
lib/ftplistparser.c
lib/wildcard.c

index 4e72e1eba0473b764968d75f7e3a40c2a035cb6e..38729884742ad34355973b1831aca1dc52455654 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -33,11 +33,14 @@ struct fileinfo *Curl_fileinfo_alloc(void)
   return calloc(1, sizeof(struct fileinfo));
 }
 
-void Curl_fileinfo_cleanup(struct fileinfo *finfo)
+void Curl_fileinfo_dtor(void *user, void *element)
 {
+  struct fileinfo *finfo = element;
+  (void) user;
   if(!finfo)
     return;
 
   Curl_safefree(finfo->info.b_data);
+
   free(finfo);
 }
index f4d8f3b90e81441ab5ae2cf82974b498e275da07..c5d0ee5b64669b9582c226b3fff19853c9931619 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,6 +31,7 @@ struct fileinfo {
 };
 
 struct fileinfo *Curl_fileinfo_alloc(void);
-void Curl_fileinfo_cleanup(struct fileinfo *finfo);
+
+void Curl_fileinfo_dtor(void *, void *);
 
 #endif /* HEADER_CURL_FILEINFO_H */
index a7830b9ce209f90c27fdd1219a06c82c7db71f42..e53e1b3b3dd6d13481320b0bd4f31e71ddd962d4 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -3699,7 +3699,7 @@ static CURLcode init_wc_data(struct connectdata *conn)
   char *path = conn->data->state.path;
   struct WildcardData *wildcard = &(conn->data->wildcard);
   CURLcode result = CURLE_OK;
-  struct ftp_wc *ftpwc = NULL;
+  struct ftp_wc *ftpwc;
 
   last_slash = strrchr(conn->data->state.path, '/');
   if(last_slash) {
@@ -3734,15 +3734,16 @@ static CURLcode init_wc_data(struct connectdata *conn)
   /* allocate ftp protocol specific wildcard data */
   ftpwc = calloc(1, sizeof(struct ftp_wc));
   if(!ftpwc) {
-    result = CURLE_OUT_OF_MEMORY;
-    goto fail;
+    Curl_safefree(wildcard->pattern);
+    return CURLE_OUT_OF_MEMORY;
   }
 
   /* INITIALIZE parselist structure */
   ftpwc->parser = Curl_ftp_parselist_data_alloc();
   if(!ftpwc->parser) {
-    result = CURLE_OUT_OF_MEMORY;
-    goto fail;
+    Curl_safefree(wildcard->pattern);
+    free(ftpwc);
+    return CURLE_OUT_OF_MEMORY;
   }
 
   wildcard->protdata = ftpwc; /* put it to the WildcardData tmp pointer */
@@ -3755,13 +3756,20 @@ static CURLcode init_wc_data(struct connectdata *conn)
   /* try to parse ftp url */
   result = ftp_parse_url_path(conn);
   if(result) {
-    goto fail;
+    Curl_safefree(wildcard->pattern);
+    wildcard->dtor(wildcard->protdata);
+    wildcard->dtor = ZERO_NULL;
+    wildcard->protdata = NULL;
+    return result;
   }
 
   wildcard->path = strdup(conn->data->state.path);
   if(!wildcard->path) {
-    result = CURLE_OUT_OF_MEMORY;
-    goto fail;
+    Curl_safefree(wildcard->pattern);
+    wildcard->dtor(wildcard->protdata);
+    wildcard->dtor = ZERO_NULL;
+    wildcard->protdata = NULL;
+    return CURLE_OUT_OF_MEMORY;
   }
 
   /* backup old write_function */
@@ -3775,17 +3783,6 @@ static CURLcode init_wc_data(struct connectdata *conn)
 
   infof(conn->data, "Wildcard - Parsing started\n");
   return CURLE_OK;
-
-  fail:
-  if(ftpwc) {
-    Curl_ftp_parselist_data_free(&ftpwc->parser);
-    free(ftpwc);
-  }
-  Curl_safefree(wildcard->pattern);
-  wildcard->dtor(wildcard->protdata);
-  wildcard->dtor = ZERO_NULL;
-  wildcard->protdata = NULL;
-  return result;
 }
 
 /* This is called recursively */
@@ -3906,8 +3903,6 @@ static CURLcode wc_statemach(struct connectdata *conn)
   case CURLWC_DONE:
   case CURLWC_ERROR:
   case CURLWC_CLEAR:
-    if(wildcard->dtor)
-      wildcard->dtor(wildcard->protdata);
     break;
   }
 
index 249fe09c84390d4be26bc3ad295fdc0838146ee0..813e954c777b47bd5b87fa34f7e149e507a551e6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -185,13 +185,10 @@ struct ftp_parselist_data *Curl_ftp_parselist_data_alloc(void)
 }
 
 
-void Curl_ftp_parselist_data_free(struct ftp_parselist_data **parserp)
+void Curl_ftp_parselist_data_free(struct ftp_parselist_data **pl_data)
 {
-  struct ftp_parselist_data *parser = *parserp;
-  if(parser)
-    Curl_fileinfo_cleanup(parser->file_data);
-  free(parser);
-  *parserp = NULL;
+  free(*pl_data);
+  *pl_data = NULL;
 }
 
 
@@ -316,7 +313,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
     Curl_llist_insert_next(llist, llist->tail, finfo, &infop->list);
   }
   else {
-    Curl_fileinfo_cleanup(infop);
+    Curl_fileinfo_dtor(NULL, finfo);
   }
 
   ftpwc->parser->file_data = NULL;
@@ -384,7 +381,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
         finfo->b_data = tmp;
       }
       else {
-        Curl_fileinfo_cleanup(parser->file_data);
+        Curl_fileinfo_dtor(NULL, parser->file_data);
         parser->file_data = NULL;
         parser->error = CURLE_OUT_OF_MEMORY;
         goto fail;
@@ -1006,13 +1003,12 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
 
     i++;
   }
-  return retsize;
 
 fail:
 
   /* Clean up any allocated memory. */
   if(parser->file_data) {
-    Curl_fileinfo_cleanup(parser->file_data);
+    Curl_fileinfo_dtor(NULL, parser->file_data);
     parser->file_data = NULL;
   }
 
index 8ba0989b4a62cbd07551263b56755f0192e787d6..cb88ab72f8db0354cf49896f5b429d396a812f57 100644 (file)
 #include "curl_memory.h"
 #include "memdebug.h"
 
-static void fileinfo_dtor(void *user, void *element)
-{
-  (void)user;
-  Curl_fileinfo_cleanup(element);
-}
-
 CURLcode Curl_wildcard_init(struct WildcardData *wc)
 {
-  Curl_llist_init(&wc->filelist, fileinfo_dtor);
+  Curl_llist_init(&wc->filelist, Curl_fileinfo_dtor);
   wc->state = CURLWC_INIT;
 
   return CURLE_OK;