From 98bcb885fe8b4003139d95aaa535f2c2dec21c99 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 30 Jul 2025 11:20:45 +0200 Subject: [PATCH] curl: make the URL indexes 64 bit Otherwise we could misbehave already at 2 billion URLs and we can't have that. A few of the counters are already correctly using the right type. Closes #18096 --- src/tool_operate.c | 2 +- src/tool_operate.h | 2 +- src/tool_sdecls.h | 2 +- src/tool_writeout.c | 19 +++++++++++-------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/tool_operate.c b/src/tool_operate.c index 1158d85736..17e1c1cf96 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -1250,7 +1250,7 @@ static CURLcode single_transfer(struct OperationConfig *config, } per->config = config; per->curl = curl; - per->urlnum = (unsigned int)u->num; + per->urlnum = u->num; /* default headers output stream is stdout */ heads = &per->heads; diff --git a/src/tool_operate.h b/src/tool_operate.h index e7c972d61d..2fe49931c1 100644 --- a/src/tool_operate.h +++ b/src/tool_operate.h @@ -42,7 +42,7 @@ struct per_transfer { struct curltime start; /* start of this transfer */ struct curltime retrystart; char *url; - unsigned int urlnum; /* the index of the given URL */ + curl_off_t urlnum; /* the index of the given URL */ char *outfile; int infd; struct ProgressData progressbar; diff --git a/src/tool_sdecls.h b/src/tool_sdecls.h index 3b01f5592a..45b7bd0c20 100644 --- a/src/tool_sdecls.h +++ b/src/tool_sdecls.h @@ -88,7 +88,7 @@ struct getout { char *url; /* the URL we deal with */ char *outfile; /* where to store the output */ char *infile; /* file to upload, if GETOUT_UPLOAD is set */ - int num; /* which URL number in an invocation */ + curl_off_t num; /* which URL number in an invocation */ BIT(outset); /* when outfile is set */ BIT(urlset); /* when URL is set */ diff --git a/src/tool_writeout.c b/src/tool_writeout.c index d348714299..dd69e3bd02 100644 --- a/src/tool_writeout.c +++ b/src/tool_writeout.c @@ -148,7 +148,7 @@ static const struct writeoutvar variables[] = { {"urle.scheme", VAR_INPUT_URLESCHEME, CURLINFO_NONE, writeString}, {"urle.user", VAR_INPUT_URLEUSER, CURLINFO_NONE, writeString}, {"urle.zoneid", VAR_INPUT_URLEZONEID, CURLINFO_NONE, writeString}, - {"urlnum", VAR_URLNUM, CURLINFO_NONE, writeLong}, + {"urlnum", VAR_URLNUM, CURLINFO_NONE, writeOffset}, {"xfer_id", VAR_EASY_ID, CURLINFO_XFER_ID, writeOffset} }; @@ -462,12 +462,6 @@ static int writeLong(FILE *stream, const struct writeoutvar *wovar, longinfo = (long)per_result; valid = true; break; - case VAR_URLNUM: - if(per->urlnum <= INT_MAX) { - longinfo = (long)per->urlnum; - valid = true; - } - break; default: DEBUGASSERT(0); break; @@ -508,7 +502,16 @@ static int writeOffset(FILE *stream, const struct writeoutvar *wovar, valid = true; } else { - DEBUGASSERT(0); + switch(wovar->id) { + case VAR_URLNUM: + if(per->urlnum <= INT_MAX) { + offinfo = per->urlnum; + valid = true; + } + break; + default: + DEBUGASSERT(0); + } } if(valid) { -- 2.47.2