gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnurl] 113/178: ftplistparser: keep state between invokes


From: gnunet
Subject: [GNUnet-SVN] [gnurl] 113/178: ftplistparser: keep state between invokes
Date: Wed, 23 May 2018 12:25:48 +0200

This is an automated email from the git hooks/post-receive script.

ng0 pushed a commit to branch master
in repository gnurl.

commit e6c22368c6e5426ec2b1cb8a3041ebc98d0ad402
Author: Daniel Stenberg <address@hidden>
AuthorDate: Thu Apr 19 15:47:05 2018 +0200

    ftplistparser: keep state between invokes
    
    Fixes FTP wildcard parsing when done over a number of read buffers.
    
    Regression from f786d1f14
    
    Reported-by: wncboy on github
    Fixes #2445
    Closes #2526
---
 lib/fileinfo.c      |  7 ++-----
 lib/fileinfo.h      |  5 ++---
 lib/ftp.c           | 38 +++++++++++++++++++++-----------------
 lib/ftplistparser.c | 18 +++++++++++-------
 lib/wildcard.c      |  8 +++++++-
 5 files changed, 43 insertions(+), 33 deletions(-)

diff --git a/lib/fileinfo.c b/lib/fileinfo.c
index 387298847..4e72e1eba 100644
--- a/lib/fileinfo.c
+++ b/lib/fileinfo.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010 - 2017, Daniel Stenberg, <address@hidden>, et al.
+ * Copyright (C) 2010 - 2018, Daniel Stenberg, <address@hidden>, 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,14 +33,11 @@ struct fileinfo *Curl_fileinfo_alloc(void)
   return calloc(1, sizeof(struct fileinfo));
 }
 
-void Curl_fileinfo_dtor(void *user, void *element)
+void Curl_fileinfo_cleanup(struct fileinfo *finfo)
 {
-  struct fileinfo *finfo = element;
-  (void) user;
   if(!finfo)
     return;
 
   Curl_safefree(finfo->info.b_data);
-
   free(finfo);
 }
diff --git a/lib/fileinfo.h b/lib/fileinfo.h
index c5d0ee5b6..f4d8f3b90 100644
--- a/lib/fileinfo.h
+++ b/lib/fileinfo.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010, 2017, Daniel Stenberg, <address@hidden>, et al.
+ * Copyright (C) 2010 - 2018, Daniel Stenberg, <address@hidden>, 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,7 +31,6 @@ struct fileinfo {
 };
 
 struct fileinfo *Curl_fileinfo_alloc(void);
-
-void Curl_fileinfo_dtor(void *, void *);
+void Curl_fileinfo_cleanup(struct fileinfo *finfo);
 
 #endif /* HEADER_CURL_FILEINFO_H */
diff --git a/lib/ftp.c b/lib/ftp.c
index e53e1b3b3..5c99d80c4 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -3688,7 +3688,7 @@ CURLcode ftp_perform(struct connectdata *conn,
 static void wc_data_dtor(void *ptr)
 {
   struct ftp_wc *ftpwc = ptr;
-  if(ftpwc)
+  if(ftpwc && ftpwc->parser)
     Curl_ftp_parselist_data_free(&ftpwc->parser);
   free(ftpwc);
 }
@@ -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;
+  struct ftp_wc *ftpwc = NULL;
 
   last_slash = strrchr(conn->data->state.path, '/');
   if(last_slash) {
@@ -3734,16 +3734,15 @@ static CURLcode init_wc_data(struct connectdata *conn)
   /* allocate ftp protocol specific wildcard data */
   ftpwc = calloc(1, sizeof(struct ftp_wc));
   if(!ftpwc) {
-    Curl_safefree(wildcard->pattern);
-    return CURLE_OUT_OF_MEMORY;
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
   }
 
   /* INITIALIZE parselist structure */
   ftpwc->parser = Curl_ftp_parselist_data_alloc();
   if(!ftpwc->parser) {
-    Curl_safefree(wildcard->pattern);
-    free(ftpwc);
-    return CURLE_OUT_OF_MEMORY;
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
   }
 
   wildcard->protdata = ftpwc; /* put it to the WildcardData tmp pointer */
@@ -3756,20 +3755,13 @@ static CURLcode init_wc_data(struct connectdata *conn)
   /* try to parse ftp url */
   result = ftp_parse_url_path(conn);
   if(result) {
-    Curl_safefree(wildcard->pattern);
-    wildcard->dtor(wildcard->protdata);
-    wildcard->dtor = ZERO_NULL;
-    wildcard->protdata = NULL;
-    return result;
+    goto fail;
   }
 
   wildcard->path = strdup(conn->data->state.path);
   if(!wildcard->path) {
-    Curl_safefree(wildcard->pattern);
-    wildcard->dtor(wildcard->protdata);
-    wildcard->dtor = ZERO_NULL;
-    wildcard->protdata = NULL;
-    return CURLE_OUT_OF_MEMORY;
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
   }
 
   /* backup old write_function */
@@ -3783,6 +3775,16 @@ 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 = ZERO_NULL;
+  wildcard->protdata = NULL;
+  return result;
 }
 
 /* This is called recursively */
@@ -3903,6 +3905,8 @@ static CURLcode wc_statemach(struct connectdata *conn)
   case CURLWC_DONE:
   case CURLWC_ERROR:
   case CURLWC_CLEAR:
+    if(wildcard->dtor)
+      wildcard->dtor(wildcard->protdata);
     break;
   }
 
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index 813e954c7..249fe09c8 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <address@hidden>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <address@hidden>, 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,10 +185,13 @@ struct ftp_parselist_data 
*Curl_ftp_parselist_data_alloc(void)
 }
 
 
-void Curl_ftp_parselist_data_free(struct ftp_parselist_data **pl_data)
+void Curl_ftp_parselist_data_free(struct ftp_parselist_data **parserp)
 {
-  free(*pl_data);
-  *pl_data = NULL;
+  struct ftp_parselist_data *parser = *parserp;
+  if(parser)
+    Curl_fileinfo_cleanup(parser->file_data);
+  free(parser);
+  *parserp = NULL;
 }
 
 
@@ -313,7 +316,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata 
*conn,
     Curl_llist_insert_next(llist, llist->tail, finfo, &infop->list);
   }
   else {
-    Curl_fileinfo_dtor(NULL, finfo);
+    Curl_fileinfo_cleanup(infop);
   }
 
   ftpwc->parser->file_data = NULL;
@@ -381,7 +384,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t 
nmemb,
         finfo->b_data = tmp;
       }
       else {
-        Curl_fileinfo_dtor(NULL, parser->file_data);
+        Curl_fileinfo_cleanup(parser->file_data);
         parser->file_data = NULL;
         parser->error = CURLE_OUT_OF_MEMORY;
         goto fail;
@@ -1003,12 +1006,13 @@ 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_dtor(NULL, parser->file_data);
+    Curl_fileinfo_cleanup(parser->file_data);
     parser->file_data = NULL;
   }
 
diff --git a/lib/wildcard.c b/lib/wildcard.c
index cb88ab72f..8ba0989b4 100644
--- a/lib/wildcard.c
+++ b/lib/wildcard.c
@@ -30,9 +30,15 @@
 #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, Curl_fileinfo_dtor);
+  Curl_llist_init(&wc->filelist, fileinfo_dtor);
   wc->state = CURLWC_INIT;
 
   return CURLE_OK;

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]