From f32451c12bb7fa4738d8c9cf6d7cd09ee876434b Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 17 Oct 2025 18:31:52 +0200 Subject: [PATCH] curlx: promote `Curl_fseeko()` to `curlx_fseek()`, use it in `src` - tool_formparse: replace truncated `fseek` with `curlx_fseek`. - tool_operate: replace truncated `fseek` with `curlx_fseek`. - tool_paramhlp: replace local duplicate `myfseek`, with `curlx_fseek`. Follow-up to 4fb12f289189e8113967e9c9da09958fd8bfa4cb #19100 Closes #19107 --- lib/curlx/fopen.c | 16 +++++++++++++++- lib/curlx/fopen.h | 2 ++ lib/formdata.c | 3 ++- lib/mime.c | 15 +-------------- lib/mime.h | 1 - src/tool_formparse.c | 2 +- src/tool_operate.c | 6 ++---- src/tool_paramhlp.c | 15 +-------------- 8 files changed, 24 insertions(+), 36 deletions(-) diff --git a/lib/curlx/fopen.c b/lib/curlx/fopen.c index 22c7259c70..cc164c8c29 100644 --- a/lib/curlx/fopen.c +++ b/lib/curlx/fopen.c @@ -32,9 +32,23 @@ #include "../curl_setup.h" +#include "fopen.h" + +int curlx_fseek(void *stream, curl_off_t offset, int whence) +{ +#if defined(_WIN32) && defined(USE_WIN32_LARGE_FILES) + return _fseeki64(stream, (__int64)offset, whence); +#elif defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO) + return fseeko(stream, (off_t)offset, whence); +#else + if(offset > LONG_MAX) + return -1; + return fseek(stream, (long)offset, whence); +#endif +} + #if defined(_WIN32) && !defined(UNDER_CE) -#include "fopen.h" #include "multibyte.h" /* declare GetFullPathNameW for mingw-w64 UWP builds targeting old windows */ diff --git a/lib/curlx/fopen.h b/lib/curlx/fopen.h index b44cbbdfce..51f4dbca17 100644 --- a/lib/curlx/fopen.h +++ b/lib/curlx/fopen.h @@ -32,6 +32,8 @@ #include /* for open() and attributes */ #endif +int curlx_fseek(void *stream, curl_off_t offset, int whence); + #if defined(_WIN32) && !defined(UNDER_CE) FILE *curlx_win32_fopen(const char *filename, const char *mode); int curlx_win32_stat(const char *path, struct_stat *buffer); diff --git a/lib/formdata.c b/lib/formdata.c index 382fd221dc..74a73028cd 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -37,6 +37,7 @@ struct Curl_easy; #include "sendf.h" #include "strdup.h" #include "rand.h" +#include "curlx/fopen.h" #include "curlx/warnless.h" /* The last 2 #include files should be in this order */ @@ -860,7 +861,7 @@ CURLcode Curl_getformdata(CURL *data, #endif result = curl_mime_data_cb(part, (curl_off_t) -1, (curl_read_callback) fread, - Curl_fseeko, + curlx_fseek, NULL, (void *) stdin); #if defined(__clang__) && __clang_major__ >= 16 #pragma clang diagnostic pop diff --git a/lib/mime.c b/lib/mime.c index baca30049f..0a56b07bc5 100644 --- a/lib/mime.c +++ b/lib/mime.c @@ -271,19 +271,6 @@ static char *Curl_basename(char *path) #define basename(x) Curl_basename((x)) #endif -int Curl_fseeko(void *stream, curl_off_t offset, int whence) -{ -#if defined(_WIN32) && defined(USE_WIN32_LARGE_FILES) - return _fseeki64(stream, (__int64)offset, whence); -#elif defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO) - return fseeko(stream, (off_t)offset, whence); -#else - if(offset > LONG_MAX) - return -1; - return fseek(stream, (long)offset, whence); -#endif -} - /* Set readback state. */ static void mimesetstate(struct mime_state *state, @@ -750,7 +737,7 @@ static int mime_file_seek(void *instream, curl_off_t offset, int whence) if(mime_open_file(part)) return CURL_SEEKFUNC_FAIL; - return Curl_fseeko(part->fp, offset, whence) ? + return curlx_fseek(part->fp, offset, whence) ? CURL_SEEKFUNC_CANTSEEK : CURL_SEEKFUNC_OK; } diff --git a/lib/mime.h b/lib/mime.h index dc6f0d4af1..5073a38f70 100644 --- a/lib/mime.h +++ b/lib/mime.h @@ -138,7 +138,6 @@ CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...) !defined(CURL_DISABLE_IMAP)) /* Prototypes. */ -int Curl_fseeko(void *stream, curl_off_t offset, int whence); void Curl_mime_initpart(struct curl_mimepart *part); void Curl_mime_cleanpart(struct curl_mimepart *part); CURLcode Curl_mime_duppart(struct Curl_easy *data, diff --git a/src/tool_formparse.c b/src/tool_formparse.c index cd3cf52e3e..0f0962ce0d 100644 --- a/src/tool_formparse.c +++ b/src/tool_formparse.c @@ -248,7 +248,7 @@ int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence) if(offset < 0) return CURL_SEEKFUNC_CANTSEEK; if(!sip->data) { - if(fseek(stdin, (long) (offset + sip->origin), SEEK_SET)) + if(curlx_fseek(stdin, offset + sip->origin, SEEK_SET)) return CURL_SEEKFUNC_CANTSEEK; } sip->curpos = offset; diff --git a/src/tool_operate.c b/src/tool_operate.c index c7d01bb59a..00a98b360b 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -584,10 +584,8 @@ static CURLcode retrycheck(struct OperationConfig *config, rc = fseek(outs->stream, 0, SEEK_END); #else /* ftruncate is not available, so just reposition the file - to the location we would have truncated it. This will not - work properly with large files on 32-bit systems, but - most of those will have ftruncate. */ - rc = fseek(outs->stream, (long)outs->init, SEEK_SET); + to the location we would have truncated it. */ + rc = curlx_fseek(outs->stream, outs->init, SEEK_SET); #endif if(rc) { errorf("Failed seeking to end of file"); diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c index 85c24f2ea3..fda0539878 100644 --- a/src/tool_paramhlp.c +++ b/src/tool_paramhlp.c @@ -119,19 +119,6 @@ ParameterError file2string(char **bufp, FILE *file) return PARAM_OK; } -static int myfseek(void *stream, curl_off_t offset, int whence) -{ -#if defined(_WIN32) && defined(USE_WIN32_LARGE_FILES) - return _fseeki64(stream, (__int64)offset, whence); -#elif defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO) - return fseeko(stream, (off_t)offset, whence); -#else - if(offset > LONG_MAX) - return -1; - return fseek(stream, (long)offset, whence); -#endif -} - ParameterError file2memory_range(char **bufp, size_t *size, FILE *file, curl_off_t starto, curl_off_t endo) { @@ -143,7 +130,7 @@ ParameterError file2memory_range(char **bufp, size_t *size, FILE *file, if(starto) { if(file != stdin) { - if(myfseek(file, starto, SEEK_SET)) + if(curlx_fseek(file, starto, SEEK_SET)) return PARAM_READ_ERROR; offset = starto; } -- 2.47.3