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
This commit is contained in:
Daniel Stenberg 2018-04-19 15:47:05 +02:00
parent 98a768f0a6
commit abbc8457d8
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
5 changed files with 43 additions and 32 deletions

View file

@ -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;
}