build: avoid overriding system symbols for fopen functions

By introducing wrappers for them in the curlx namespace:
`curlx_fopen()`, `curlx_fdopen()`, `curlx_fclose()`.

The undefine/redefine/`(function)()` methods broke on systems
implementing these functions as macros. E.g. AIX 32-bit's `fopen()`.

Also:
- rename `lib/fopen.*` to `lib/curl_fopen.*` (for `Curl_fopen()`)
  to make room for the newly added `curlx/fopen.h`.
- curlx: move file-related functions from `multibyte.c` to `fopen.c`.
- tests/server: stop using the curl-specific `fopen()` implementation
  on Windows. Unicode isn't used by runtests, and it isn't critical to
  run tests on longs path. It can be re-enabled if this becomes
  necessary, or if the wrapper receives a feature that's critical for
  test servers.

Reported-by: Andrew Kirillov
Bug: https://github.com/curl/curl/issues/18510#issuecomment-3274393640

Follow-up to bf7375ecc5 #18503
Follow-up to 9863599d69 #18502
Follow-up to 3bb5e58c10 #17827

Closes #18634
This commit is contained in:
Viktor Szakats 2025-09-14 15:34:18 +02:00
parent 10bac43b87
commit 20142f5d06
No known key found for this signature in database
GPG key ID: B5ABD165E2AEF201
65 changed files with 568 additions and 484 deletions

View file

@ -29,6 +29,7 @@
#include <curl/curl.h>
#include "urldata.h"
#include "curlx/fopen.h" /* for CURLX_FOPEN_LOW() */
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@ -68,7 +69,8 @@ static void curl_dbg_cleanup(void)
if(curl_dbg_logfile &&
curl_dbg_logfile != stderr &&
curl_dbg_logfile != stdout) {
(fclose)(curl_dbg_logfile);
/* !checksrc! disable BANNEDFUNC 1 */
fclose(curl_dbg_logfile);
}
curl_dbg_logfile = NULL;
}
@ -78,11 +80,7 @@ void curl_dbg_memdebug(const char *logname)
{
if(!curl_dbg_logfile) {
if(logname && *logname)
#ifdef CURL_FOPEN
curl_dbg_logfile = CURL_FOPEN(logname, FOPEN_WRITETEXT);
#else
curl_dbg_logfile = (fopen)(logname, FOPEN_WRITETEXT);
#endif
curl_dbg_logfile = CURLX_FOPEN_LOW(logname, FOPEN_WRITETEXT);
else
curl_dbg_logfile = stderr;
#ifdef MEMDEBUG_LOG_SYNC
@ -424,13 +422,7 @@ ALLOC_FUNC
FILE *curl_dbg_fopen(const char *file, const char *mode,
int line, const char *source)
{
FILE *res;
#ifdef CURL_FOPEN
res = CURL_FOPEN(file, mode);
#else
res = (fopen)(file, mode);
#endif
FILE *res = CURLX_FOPEN_LOW(file, mode);
if(source)
curl_dbg_log("FILE %s:%d fopen(\"%s\",\"%s\") = %p\n",
source, line, file, mode, (void *)res);
@ -442,7 +434,8 @@ ALLOC_FUNC
FILE *curl_dbg_fdopen(int filedes, const char *mode,
int line, const char *source)
{
FILE *res = (fdopen)(filedes, mode);
/* !checksrc! disable BANNEDFUNC 1 */
FILE *res = fdopen(filedes, mode);
if(source)
curl_dbg_log("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n",
source, line, filedes, mode, (void *)res);
@ -459,7 +452,8 @@ int curl_dbg_fclose(FILE *file, int line, const char *source)
curl_dbg_log("FILE %s:%d fclose(%p)\n",
source, line, (void *)file);
res = (fclose)(file);
/* !checksrc! disable BANNEDFUNC 1 */
res = fclose(file);
return res;
}