mark_as_advanced(CURL_DISABLE_TYPECHECK)
option(CURL_DISABLE_VERBOSE_STRINGS "Disable verbose strings" OFF)
mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
+option(CURL_DEBUG_GLOBAL_MEM "Debug curl_global_init_mem" OFF)
+mark_as_advanced(CURL_DEBUG_GLOBAL_MEM)
+if(CURL_DEBUG_GLOBAL_MEM)
+ # Set it via the command-line to make it apply to the entire directory.
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "CURL_DEBUG_GLOBAL_MEM")
+endif()
if(CURL_DISABLE_TYPECHECK)
# Set it via the command-line to make it apply to examples also.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "CURL_DISABLE_TYPECHECK")
AC_MSG_RESULT(no)
)
+AC_MSG_CHECKING([enable curl_global_init_mem debug build])
+AC_ARG_ENABLE(init-mem-debug,
+AS_HELP_STRING([--enable-init-mem-debug],[curl_global_init_mem debug])
+AS_HELP_STRING([--disable-init-mem-debug],[]),
+[ case "$enableval" in
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(CURL_DEBUG_GLOBAL_MEM, 1, [curl_debug_global_mem debug build])
+ SUPPORT_FEATURES="$SUPPORT_FEATURES global-mem-debug"
+ ;;
+ *)
+ AC_MSG_RESULT(no)
+ ;;
+ esac ],
+ AC_MSG_RESULT(no)
+)
+
dnl **********************************************************************
dnl Check for built-in manual
dnl **********************************************************************
* SPDX-License-Identifier: curl
*
***************************************************************************/
+#include <stddef.h>
#include "tool_setup.h"
#include "tool_cfgable.h"
}
}
+#ifdef CURL_DEBUG_GLOBAL_MEM
+
+#ifdef CURL_MEMDEBUG
+#error "curl_global_init_mem() testing does not work with memdebug debugging"
+#endif
+
+/*
+ * This is the custom memory functions handed to curl when we run special test
+ * round to verify them.
+ *
+ * The main point is to make sure that what is returned is different than what
+ * the regular memory functions return so that mixup will trigger problems.
+ */
+
+struct extramem {
+ size_t extra;
+ union {
+ curl_off_t o;
+ double d;
+ void *p;
+ } mem[1];
+};
+
+static void *custom_calloc(size_t wanted_nmemb, size_t wanted_size)
+{
+ struct extramem *m;
+ size_t sz = wanted_size * wanted_nmemb;
+ sz += sizeof(struct extramem);
+ m = curlx_calloc(1, sz);
+ if(m)
+ return m->mem;
+ return NULL;
+}
+
+static void *custom_malloc(size_t wanted_size)
+{
+ struct extramem *m;
+ size_t sz = wanted_size + sizeof(struct extramem);
+ m = curlx_malloc(sz);
+ if(m)
+ return m->mem;
+ return NULL;
+}
+
+static char *custom_strdup(const char *ptr)
+{
+ struct extramem *m;
+ size_t size = strlen(ptr) + 1;
+ size_t sz = size + sizeof(struct extramem);
+ m = curlx_malloc(sz);
+ if(m) {
+ char *p = (char *)m->mem;
+ /* since strcpy is banned, we do memcpy */
+ memcpy(p, ptr, sz);
+ p[sz] = 0;
+ return (char *)m->mem;
+ }
+ return NULL;
+
+}
+
+static void *custom_realloc(void *ptr, size_t size)
+{
+ struct extramem *m = NULL;
+ size_t sz = size + sizeof(struct extramem);
+ if(ptr)
+ m = (void *)((char *)ptr - offsetof(struct extramem, mem));
+ m = curlx_realloc(ptr, sz);
+ if(m)
+ return m->mem;
+ return NULL;
+}
+
+static void custom_free(void *ptr)
+{
+ struct extramem *m = NULL;
+ if(ptr) {
+ m = (void *)((char *)ptr - offsetof(struct extramem, mem));
+ curlx_free(m);
+ }
+}
+
+#endif
+
/*
* This is the main global constructor for the app. Call this before
* _any_ libcurl usage. If this fails, *NO* libcurl functions may be
global->first = global->last = config_alloc();
if(global->first) {
/* Perform the libcurl initialization */
+#ifdef GLOBAL_MEM
+ result = curl_global_init_mem(CURL_GLOBAL_ALL, custom_malloc, custom_free,
+ custom_realloc, custom_strdup,
+ custom_calloc);
+#else
result = curl_global_init(CURL_GLOBAL_DEFAULT);
+#endif
if(!result) {
/* Get information about libcurl */
result = get_libcurl_info();