mirror of
https://github.com/curl/curl.git
synced 2026-04-13 00:31:41 +08:00
Fixing:
- HTTPS-RR builds with c-ares and Linux MUSL.
- curl-for-win minimal builds with Linux MUSL.
It should fix all other kinds of entaglement between curl's redefintions
of system symbols and system (or 3rd-party) headers sensitive to that.
It also syncs memory override behavior between unity & non-unity builds,
thus reducing build variations.
The idea is to define and declare everything once in `curl_setup.h`,
without overriding any system symbols with curl ones yet. Then, like
before this patch, override them, if necessary, in each source file via
`curl_memory.h` and `memdebug.h`, after including system headers.
To ensure a clean slate with no overrides at the beginning of each
source file, reset all of them unconditionally at the end of
`curl_setup.h`, by including `curl_mem_undef.h`. (This assumes
`curl_setup.h` is always included first, which is already the case
throughout the codebase.)
`curl_mem_undef.h` can also be included explicitly wherever overrides
are causing problems. E.g. in tests which use unity-style builds and
a previously included `curl_memory.h`/`memdebug.h` can be spilling into
other source files.
The simplified role of the two override headers:
- `curl_memory.h`: overrides system memory allocator functions to
libcurl ones, when memory tracing (aka `CURLDEBUG`) is disabled.
- `memdebug.h`: overrides system memory allocator and some other
functions to curl debug functions, when memory tracing is enabled.
Changed made in this patch, step-by-step:
- curl_memory.h: move allocator typedefs and protos to `curl_setup.h`.
- memdebug.h: move `ALLOC_*` macros to `curl_setup.h`.
- memdebug.h: move allocator protos to `curl_setup.h`.
- memdebug.h: move `Curl_safefree()` macro to `curl_setup.h`.
(it's a regular macro, with a one-time, global, definition.)
- curl_memory.h: move system symbol undefs to a new, separate header:
`curl_mem_undef.h`.
- curl_setup.h: include `curl_mem_undef.h` at the end, unconditionally,
to reset system symbol macros after each inclusion.
- handle `sclose()` and `fake_sclose()` in `curl_setup.h`. They are not
system symbols, a one-time definition does the job.
Also:
- GHA/linux: enable unity mode for the HTTP-RR c-ares MUSL job.
Follow-up to 17ab4d62e6 #16413
That said, I'd still find it better to avoid redefining system macros.
To communicate clearly the fact that they are not the original system
calls and they do behave differently. And, it would allow dropping the
undef/redef dance in each source file, and maintaining the logic with
it. The "last #include files should be in this order" comments in each
source would also become unnecessary. Also the trick of using
`(func)` (or interim macros) to call the non-overridden function where
required. This method works for printf and most everything else already.
For `_tcsdup`, socket and fopen functions this could work without
disturbing the codebase much.
Ref: #16428 (clean reboot of)
Closes #17827
90 lines
3.2 KiB
C
90 lines
3.2 KiB
C
#ifndef HEADER_CURL_MEMORY_H
|
|
#define HEADER_CURL_MEMORY_H
|
|
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at https://curl.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
* SPDX-License-Identifier: curl
|
|
*
|
|
***************************************************************************/
|
|
|
|
/*
|
|
* Nasty internal details ahead...
|
|
*
|
|
* File curl_memory.h must be included by _all_ *.c source files
|
|
* that use memory related functions strdup, malloc, calloc, realloc
|
|
* or free, and given source file is used to build libcurl library.
|
|
* It should be included immediately before memdebug.h as the last files
|
|
* included to avoid undesired interaction with other memory function
|
|
* headers in dependent libraries.
|
|
*
|
|
* There is nearly no exception to above rule. All libcurl source
|
|
* files in 'lib' subdirectory as well as those living deep inside
|
|
* 'packages' subdirectories and linked together in order to build
|
|
* libcurl library shall follow it.
|
|
*
|
|
* File lib/strdup.c is an exception, given that it provides a strdup
|
|
* clone implementation while using malloc. Extra care needed inside
|
|
* this one.
|
|
*
|
|
* The need for curl_memory.h inclusion is due to libcurl's feature
|
|
* of allowing library user to provide memory replacement functions,
|
|
* memory callbacks, at runtime with curl_global_init_mem()
|
|
*
|
|
* Any *.c source file used to build libcurl library that does not
|
|
* include curl_memory.h and uses any memory function of the five
|
|
* mentioned above will compile without any indication, but it will
|
|
* trigger weird memory related issues at runtime.
|
|
*
|
|
*/
|
|
|
|
#ifndef CURLDEBUG
|
|
|
|
/*
|
|
* libcurl's 'memory tracking' system defines strdup, malloc, calloc,
|
|
* realloc and free, along with others, in memdebug.h in a different
|
|
* way although still using memory callbacks forward declared above.
|
|
* When using the 'memory tracking' system (CURLDEBUG defined) we do
|
|
* not define here the five memory functions given that definitions
|
|
* from memdebug.h are the ones that shall be used.
|
|
*/
|
|
|
|
#undef strdup
|
|
#define strdup(ptr) Curl_cstrdup(ptr)
|
|
#undef malloc
|
|
#define malloc(size) Curl_cmalloc(size)
|
|
#undef calloc
|
|
#define calloc(nbelem,size) Curl_ccalloc(nbelem, size)
|
|
#undef realloc
|
|
#define realloc(ptr,size) Curl_crealloc(ptr, size)
|
|
#undef free
|
|
#define free(ptr) Curl_cfree(ptr)
|
|
|
|
#ifdef _WIN32
|
|
#undef _tcsdup
|
|
#ifdef UNICODE
|
|
#define _tcsdup(ptr) Curl_wcsdup(ptr)
|
|
#else
|
|
#define _tcsdup(ptr) Curl_cstrdup(ptr)
|
|
#endif
|
|
#endif /* _WIN32 */
|
|
|
|
#endif /* CURLDEBUG */
|
|
#endif /* HEADER_CURL_MEMORY_H */
|