tool: move the error buffer to the per transfer struct

To avoid having to alloc or manage it separately.

Closes #18442
This commit is contained in:
Daniel Stenberg 2025-08-31 16:24:44 +02:00
parent 54f1ef05d6
commit 84c92f7113
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 10 additions and 27 deletions

View File

@ -40,9 +40,6 @@
#define BUFFER_SIZE 102400L
/* When doing serial transfers, we use a single fixed error area */
static char global_errorbuffer[CURL_ERROR_SIZE];
#ifdef IP_TOS
static int get_address_family(curl_socket_t sockfd)
{
@ -869,10 +866,7 @@ CURLcode config2setopts(struct OperationConfig *config,
my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options);
my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
my_setopt_str(curl, CURLOPT_RANGE, config->range);
if(!global->parallel) {
per->errorbuffer = global_errorbuffer;
my_setopt(curl, CURLOPT_ERRORBUFFER, global_errorbuffer);
}
my_setopt(curl, CURLOPT_ERRORBUFFER, per->errorbuffer);
my_setopt_long(curl, CURLOPT_TIMEOUT_MS, config->timeout_ms);
switch(config->httpreq) {

View File

@ -582,7 +582,7 @@ static CURLcode post_per_transfer(struct per_transfer *per,
(!global->silent || global->showerror)) {
const char *msg = per->errorbuffer;
fprintf(tool_stderr, "curl: (%d) %s\n", result,
(msg && msg[0]) ? msg : curl_easy_strerror(result));
msg[0] ? msg : curl_easy_strerror(result));
if(result == CURLE_PEER_FAILED_VERIFICATION)
fputs(CURL_CA_CERT_ERRORMSG, tool_stderr);
}
@ -705,8 +705,6 @@ skip:
free(per->url);
free(per->outfile);
free(per->uploadfile);
if(global->parallel)
free(per->errorbuffer);
curl_slist_free_all(per->hdrcbdata.headlist);
per->hdrcbdata.headlist = NULL;
return result;
@ -1346,7 +1344,6 @@ static CURLcode add_parallel_transfers(CURLM *multi, CURLSH *share,
CURLcode result = CURLE_OK;
CURLMcode mcode;
bool sleeping = FALSE;
char *errorbuf;
curl_off_t nxfers;
*addedp = FALSE;
@ -1381,10 +1378,6 @@ static CURLcode add_parallel_transfers(CURLM *multi, CURLSH *share,
if(result)
return result;
errorbuf = malloc(CURL_ERROR_SIZE);
if(!errorbuf)
return CURLE_OUT_OF_MEMORY;
/* parallel connect means that we do not set PIPEWAIT since pipewait
will make libcurl prefer multiplexing */
(void)curl_easy_setopt(per->curl, CURLOPT_PIPEWAIT,
@ -1395,6 +1388,7 @@ static CURLcode add_parallel_transfers(CURLM *multi, CURLSH *share,
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);
(void)curl_easy_setopt(per->curl, CURLOPT_NOPROGRESS, 0L);
(void)curl_easy_setopt(per->curl, CURLOPT_ERRORBUFFER, per->errorbuffer);
#ifdef DEBUGBUILD
if(getenv("CURL_FORBID_REUSE"))
(void)curl_easy_setopt(per->curl, CURLOPT_FORBID_REUSE, 1L);
@ -1415,13 +1409,10 @@ static CURLcode add_parallel_transfers(CURLM *multi, CURLSH *share,
break;
} while(skipped);
}
if(result) {
free(errorbuf);
if(result)
return result;
}
errorbuf[0] = 0;
(void)curl_easy_setopt(per->curl, CURLOPT_ERRORBUFFER, errorbuf);
per->errorbuffer = errorbuf;
per->errorbuffer[0] = 0;
per->added = TRUE;
all_added++;
*addedp = TRUE;
@ -1706,8 +1697,7 @@ static CURLcode check_finished(struct parastate *s)
curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
curl_multi_remove_handle(s->multi, easy);
if(ended->abort && (tres == CURLE_ABORTED_BY_CALLBACK) &&
ended->errorbuffer) {
if(ended->abort && (tres == CURLE_ABORTED_BY_CALLBACK)) {
msnprintf(ended->errorbuffer, CURL_ERROR_SIZE,
"Transfer aborted due to critical error "
"in another transfer");

View File

@ -66,8 +66,7 @@ struct per_transfer {
/* NULL or malloced */
char *uploadfile;
char *errorbuffer; /* allocated and assigned while this is used for a
transfer */
char errorbuffer[CURL_ERROR_SIZE];
BIT(infdopen); /* TRUE if infd needs closing */
BIT(noprogress);
BIT(was_last_header_empty);

View File

@ -361,8 +361,8 @@ static int writeString(FILE *stream, const struct writeoutvar *wovar,
break;
case VAR_ERRORMSG:
if(per_result) {
strinfo = (per->errorbuffer && per->errorbuffer[0]) ?
per->errorbuffer : curl_easy_strerror(per_result);
strinfo = (per->errorbuffer[0]) ? per->errorbuffer :
curl_easy_strerror(per_result);
valid = true;
}
break;