From abbc8457d85aca74b7cfda1d394b0844932b2934 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 19 Apr 2018 15:47:05 +0200 Subject: ftplistparser: keep state between invokes Fixes FTP wildcard parsing when doing over a number of read buffers. Regression from f786d1f14 Reported-by: wncboy on github Fixes #2445 Closes #2519 --- lib/ftp.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) (limited to 'lib/ftp.c') diff --git a/lib/ftp.c b/lib/ftp.c index e53e1b3b3..a7830b9ce 100644 --- 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; + 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,17 @@ 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 */ @@ -3903,6 +3906,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; } -- cgit v1.2.3