From: Daniel Stenberg Date: Mon, 17 Oct 2022 09:44:13 +0000 (+0200) Subject: tool_operate: more transfer cleanup after parallel transfer fail X-Git-Tag: curl-7_86_0~41 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ec977b050d4073d19e5fa9c817c3d46290c937ac;p=thirdparty%2Fcurl.git tool_operate: more transfer cleanup after parallel transfer fail In some circumstances when doing parallel transfers, the single_transfer_cleanup() would not be called and then 'inglob' could leak. Test 496 verifies Reported-by: Trail of Bits Closes #9749 --- diff --git a/src/tool_operate.c b/src/tool_operate.c index c64b17d063..08e71fdfde 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -350,6 +350,26 @@ static void AmigaSetComment(struct per_transfer *per, /* When doing serial transfers, we use a single fixed error area */ static char global_errorbuffer[CURL_ERROR_SIZE]; +void single_transfer_cleanup(struct OperationConfig *config) +{ + if(config) { + struct State *state = &config->state; + if(state->urls) { + /* Free list of remaining URLs */ + glob_cleanup(state->urls); + state->urls = NULL; + } + Curl_safefree(state->outfiles); + Curl_safefree(state->httpgetfields); + Curl_safefree(state->uploadfile); + if(state->inglob) { + /* Free list of globbed upload files */ + glob_cleanup(state->inglob); + state->inglob = NULL; + } + } +} + /* * Call this after a transfer has completed. */ @@ -666,26 +686,6 @@ static CURLcode post_per_transfer(struct GlobalConfig *global, return result; } -static void single_transfer_cleanup(struct OperationConfig *config) -{ - if(config) { - struct State *state = &config->state; - if(state->urls) { - /* Free list of remaining URLs */ - glob_cleanup(state->urls); - state->urls = NULL; - } - Curl_safefree(state->outfiles); - Curl_safefree(state->httpgetfields); - Curl_safefree(state->uploadfile); - if(state->inglob) { - /* Free list of globbed upload files */ - glob_cleanup(state->inglob); - state->inglob = NULL; - } - } -} - /* * Return the protocol token for the scheme used in the given URL */ diff --git a/src/tool_operate.h b/src/tool_operate.h index 56e002a3f2..c714da1bc2 100644 --- a/src/tool_operate.h +++ b/src/tool_operate.h @@ -76,6 +76,7 @@ struct per_transfer { }; CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]); +void single_transfer_cleanup(struct OperationConfig *config); extern struct per_transfer *transfers; /* first node */ diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index f41406f3ce..eb58772fb9 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -22,6 +22,7 @@ * ***************************************************************************/ #include "tool_setup.h" +#include "tool_operate.h" #include "strcase.h" @@ -51,6 +52,7 @@ void clean_getout(struct OperationConfig *config) } config->url_list = NULL; } + single_transfer_cleanup(config); } bool output_expected(const char *url, const char *uploadfile) diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 722f4a8ec3..8195ad7ecc 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -73,7 +73,7 @@ test430 test431 test432 test433 test434 test435 test436 \ \ test440 test441 test442 test443 test444 \ \ -test490 test491 test492 test493 test494 test495 \ +test490 test491 test492 test493 test494 test495 test496 \ \ test500 test501 test502 test503 test504 test505 test506 test507 test508 \ test509 test510 test511 test512 test513 test514 test515 test516 test517 \ diff --git a/tests/data/test496 b/tests/data/test496 new file mode 100644 index 0000000000..19050f3772 --- /dev/null +++ b/tests/data/test496 @@ -0,0 +1,36 @@ + + + +curl tool +cmdline +parallel + + + +# +# Server-side + + + +# +# Client-side + + +none + + +parallel upload missing file + + +0 -Z -Tz + + + +# +# Verify data after the test has been "shot" + + +26 + + +