1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_MEMDEBUG_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_MEMDEBUG_H 3*6236dae4SAndroid Build Coastguard Worker #ifdef CURLDEBUG 4*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 5*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 6*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 7*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 8*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 9*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 10*6236dae4SAndroid Build Coastguard Worker * 11*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 12*6236dae4SAndroid Build Coastguard Worker * 13*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 14*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 15*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 16*6236dae4SAndroid Build Coastguard Worker * 17*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 18*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 19*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 20*6236dae4SAndroid Build Coastguard Worker * 21*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 22*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 23*6236dae4SAndroid Build Coastguard Worker * 24*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 25*6236dae4SAndroid Build Coastguard Worker * 26*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 27*6236dae4SAndroid Build Coastguard Worker 28*6236dae4SAndroid Build Coastguard Worker /* 29*6236dae4SAndroid Build Coastguard Worker * CAUTION: this header is designed to work when included by the app-side 30*6236dae4SAndroid Build Coastguard Worker * as well as the library. Do not mix with library internals! 31*6236dae4SAndroid Build Coastguard Worker */ 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h> 34*6236dae4SAndroid Build Coastguard Worker #include "functypes.h" 35*6236dae4SAndroid Build Coastguard Worker 36*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) && __GNUC__ >= 3 37*6236dae4SAndroid Build Coastguard Worker # define ALLOC_FUNC __attribute__((__malloc__)) 38*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE(s) __attribute__((__alloc_size__(s))) 39*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE2(n, s) __attribute__((__alloc_size__(n, s))) 40*6236dae4SAndroid Build Coastguard Worker #elif defined(_MSC_VER) 41*6236dae4SAndroid Build Coastguard Worker # define ALLOC_FUNC __declspec(restrict) 42*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE(s) 43*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE2(n, s) 44*6236dae4SAndroid Build Coastguard Worker #else 45*6236dae4SAndroid Build Coastguard Worker # define ALLOC_FUNC 46*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE(s) 47*6236dae4SAndroid Build Coastguard Worker # define ALLOC_SIZE2(n, s) 48*6236dae4SAndroid Build Coastguard Worker #endif 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard Worker #define CURL_MT_LOGFNAME_BUFSIZE 512 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Worker extern FILE *curl_dbg_logfile; 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard Worker /* memory functions */ 55*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC ALLOC_SIZE(1) void *curl_dbg_malloc(size_t size, 56*6236dae4SAndroid Build Coastguard Worker int line, 57*6236dae4SAndroid Build Coastguard Worker const char *source); 58*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC ALLOC_SIZE2(1, 2) void *curl_dbg_calloc(size_t elements, 59*6236dae4SAndroid Build Coastguard Worker size_t size, int line, const char *source); 60*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_SIZE(2) void *curl_dbg_realloc(void *ptr, 61*6236dae4SAndroid Build Coastguard Worker size_t size, 62*6236dae4SAndroid Build Coastguard Worker int line, 63*6236dae4SAndroid Build Coastguard Worker const char *source); 64*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN void curl_dbg_free(void *ptr, int line, const char *source); 65*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC char *curl_dbg_strdup(const char *str, int line, 66*6236dae4SAndroid Build Coastguard Worker const char *src); 67*6236dae4SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(UNICODE) 68*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC wchar_t *curl_dbg_wcsdup(const wchar_t *str, 69*6236dae4SAndroid Build Coastguard Worker int line, 70*6236dae4SAndroid Build Coastguard Worker const char *source); 71*6236dae4SAndroid Build Coastguard Worker #endif 72*6236dae4SAndroid Build Coastguard Worker 73*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN void curl_dbg_memdebug(const char *logname); 74*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN void curl_dbg_memlimit(long limit); 75*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN void curl_dbg_log(const char *format, ...) CURL_PRINTF(1, 2); 76*6236dae4SAndroid Build Coastguard Worker 77*6236dae4SAndroid Build Coastguard Worker /* file descriptor manipulators */ 78*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN curl_socket_t curl_dbg_socket(int domain, int type, int protocol, 79*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 80*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN void curl_dbg_mark_sclose(curl_socket_t sockfd, 81*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 82*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN int curl_dbg_sclose(curl_socket_t sockfd, 83*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 84*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN curl_socket_t curl_dbg_accept(curl_socket_t s, void *a, void *alen, 85*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 86*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SOCKETPAIR 87*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN int curl_dbg_socketpair(int domain, int type, int protocol, 88*6236dae4SAndroid Build Coastguard Worker curl_socket_t socket_vector[2], 89*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 90*6236dae4SAndroid Build Coastguard Worker #endif 91*6236dae4SAndroid Build Coastguard Worker 92*6236dae4SAndroid Build Coastguard Worker /* send/receive sockets */ 93*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN SEND_TYPE_RETV curl_dbg_send(SEND_TYPE_ARG1 sockfd, 94*6236dae4SAndroid Build Coastguard Worker SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf, 95*6236dae4SAndroid Build Coastguard Worker SEND_TYPE_ARG3 len, 96*6236dae4SAndroid Build Coastguard Worker SEND_TYPE_ARG4 flags, int line, 97*6236dae4SAndroid Build Coastguard Worker const char *source); 98*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd, 99*6236dae4SAndroid Build Coastguard Worker RECV_TYPE_ARG2 buf, 100*6236dae4SAndroid Build Coastguard Worker RECV_TYPE_ARG3 len, 101*6236dae4SAndroid Build Coastguard Worker RECV_TYPE_ARG4 flags, int line, 102*6236dae4SAndroid Build Coastguard Worker const char *source); 103*6236dae4SAndroid Build Coastguard Worker 104*6236dae4SAndroid Build Coastguard Worker /* FILE functions */ 105*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC FILE *curl_dbg_fopen(const char *file, const char *mode, 106*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 107*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN ALLOC_FUNC FILE *curl_dbg_fdopen(int filedes, const char *mode, 108*6236dae4SAndroid Build Coastguard Worker int line, const char *source); 109*6236dae4SAndroid Build Coastguard Worker 110*6236dae4SAndroid Build Coastguard Worker CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source); 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Worker #ifndef MEMDEBUG_NODEFINES 113*6236dae4SAndroid Build Coastguard Worker 114*6236dae4SAndroid Build Coastguard Worker /* Set this symbol on the command-line, recompile all lib-sources */ 115*6236dae4SAndroid Build Coastguard Worker #undef strdup 116*6236dae4SAndroid Build Coastguard Worker #define strdup(ptr) curl_dbg_strdup(ptr, __LINE__, __FILE__) 117*6236dae4SAndroid Build Coastguard Worker #undef malloc 118*6236dae4SAndroid Build Coastguard Worker #define malloc(size) curl_dbg_malloc(size, __LINE__, __FILE__) 119*6236dae4SAndroid Build Coastguard Worker #undef calloc 120*6236dae4SAndroid Build Coastguard Worker #define calloc(nbelem,size) curl_dbg_calloc(nbelem, size, __LINE__, __FILE__) 121*6236dae4SAndroid Build Coastguard Worker #undef realloc 122*6236dae4SAndroid Build Coastguard Worker #define realloc(ptr,size) curl_dbg_realloc(ptr, size, __LINE__, __FILE__) 123*6236dae4SAndroid Build Coastguard Worker #undef free 124*6236dae4SAndroid Build Coastguard Worker #define free(ptr) curl_dbg_free(ptr, __LINE__, __FILE__) 125*6236dae4SAndroid Build Coastguard Worker #undef send 126*6236dae4SAndroid Build Coastguard Worker #define send(a,b,c,d) curl_dbg_send(a,b,c,d, __LINE__, __FILE__) 127*6236dae4SAndroid Build Coastguard Worker #undef recv 128*6236dae4SAndroid Build Coastguard Worker #define recv(a,b,c,d) curl_dbg_recv(a,b,c,d, __LINE__, __FILE__) 129*6236dae4SAndroid Build Coastguard Worker 130*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32 131*6236dae4SAndroid Build Coastguard Worker # ifdef UNICODE 132*6236dae4SAndroid Build Coastguard Worker # undef wcsdup 133*6236dae4SAndroid Build Coastguard Worker # define wcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__) 134*6236dae4SAndroid Build Coastguard Worker # undef _wcsdup 135*6236dae4SAndroid Build Coastguard Worker # define _wcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__) 136*6236dae4SAndroid Build Coastguard Worker # undef _tcsdup 137*6236dae4SAndroid Build Coastguard Worker # define _tcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__) 138*6236dae4SAndroid Build Coastguard Worker # else 139*6236dae4SAndroid Build Coastguard Worker # undef _tcsdup 140*6236dae4SAndroid Build Coastguard Worker # define _tcsdup(ptr) curl_dbg_strdup(ptr, __LINE__, __FILE__) 141*6236dae4SAndroid Build Coastguard Worker # endif 142*6236dae4SAndroid Build Coastguard Worker #endif 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Worker #undef socket 145*6236dae4SAndroid Build Coastguard Worker #define socket(domain,type,protocol)\ 146*6236dae4SAndroid Build Coastguard Worker curl_dbg_socket((int)domain, type, protocol, __LINE__, __FILE__) 147*6236dae4SAndroid Build Coastguard Worker #undef accept /* for those with accept as a macro */ 148*6236dae4SAndroid Build Coastguard Worker #define accept(sock,addr,len)\ 149*6236dae4SAndroid Build Coastguard Worker curl_dbg_accept(sock, addr, len, __LINE__, __FILE__) 150*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SOCKETPAIR 151*6236dae4SAndroid Build Coastguard Worker #define socketpair(domain,type,protocol,socket_vector)\ 152*6236dae4SAndroid Build Coastguard Worker curl_dbg_socketpair((int)domain, type, protocol, socket_vector, \ 153*6236dae4SAndroid Build Coastguard Worker __LINE__, __FILE__) 154*6236dae4SAndroid Build Coastguard Worker #endif 155*6236dae4SAndroid Build Coastguard Worker 156*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_NO_GETADDRINFO_OVERRIDE 157*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GETADDRINFO 158*6236dae4SAndroid Build Coastguard Worker #if defined(getaddrinfo) && defined(__osf__) 159*6236dae4SAndroid Build Coastguard Worker /* OSF/1 and Tru64 have getaddrinfo as a define already, so we cannot define 160*6236dae4SAndroid Build Coastguard Worker our macro as for other platforms. Instead, we redefine the new name they 161*6236dae4SAndroid Build Coastguard Worker define getaddrinfo to become! */ 162*6236dae4SAndroid Build Coastguard Worker #define ogetaddrinfo(host,serv,hint,res) \ 163*6236dae4SAndroid Build Coastguard Worker curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__) 164*6236dae4SAndroid Build Coastguard Worker #else 165*6236dae4SAndroid Build Coastguard Worker #undef getaddrinfo 166*6236dae4SAndroid Build Coastguard Worker #define getaddrinfo(host,serv,hint,res) \ 167*6236dae4SAndroid Build Coastguard Worker curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__) 168*6236dae4SAndroid Build Coastguard Worker #endif 169*6236dae4SAndroid Build Coastguard Worker #endif /* HAVE_GETADDRINFO */ 170*6236dae4SAndroid Build Coastguard Worker 171*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_FREEADDRINFO 172*6236dae4SAndroid Build Coastguard Worker #undef freeaddrinfo 173*6236dae4SAndroid Build Coastguard Worker #define freeaddrinfo(data) \ 174*6236dae4SAndroid Build Coastguard Worker curl_dbg_freeaddrinfo(data, __LINE__, __FILE__) 175*6236dae4SAndroid Build Coastguard Worker #endif /* HAVE_FREEADDRINFO */ 176*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_NO_GETADDRINFO_OVERRIDE */ 177*6236dae4SAndroid Build Coastguard Worker 178*6236dae4SAndroid Build Coastguard Worker /* sclose is probably already defined, redefine it! */ 179*6236dae4SAndroid Build Coastguard Worker #undef sclose 180*6236dae4SAndroid Build Coastguard Worker #define sclose(sockfd) curl_dbg_sclose(sockfd,__LINE__,__FILE__) 181*6236dae4SAndroid Build Coastguard Worker 182*6236dae4SAndroid Build Coastguard Worker #define fake_sclose(sockfd) curl_dbg_mark_sclose(sockfd,__LINE__,__FILE__) 183*6236dae4SAndroid Build Coastguard Worker 184*6236dae4SAndroid Build Coastguard Worker #undef fopen 185*6236dae4SAndroid Build Coastguard Worker #define fopen(file,mode) curl_dbg_fopen(file,mode,__LINE__,__FILE__) 186*6236dae4SAndroid Build Coastguard Worker #undef fdopen 187*6236dae4SAndroid Build Coastguard Worker #define fdopen(file,mode) curl_dbg_fdopen(file,mode,__LINE__,__FILE__) 188*6236dae4SAndroid Build Coastguard Worker #define fclose(file) curl_dbg_fclose(file,__LINE__,__FILE__) 189*6236dae4SAndroid Build Coastguard Worker 190*6236dae4SAndroid Build Coastguard Worker #endif /* MEMDEBUG_NODEFINES */ 191*6236dae4SAndroid Build Coastguard Worker 192*6236dae4SAndroid Build Coastguard Worker #endif /* CURLDEBUG */ 193*6236dae4SAndroid Build Coastguard Worker 194*6236dae4SAndroid Build Coastguard Worker /* 195*6236dae4SAndroid Build Coastguard Worker ** Following section applies even when CURLDEBUG is not defined. 196*6236dae4SAndroid Build Coastguard Worker */ 197*6236dae4SAndroid Build Coastguard Worker 198*6236dae4SAndroid Build Coastguard Worker #ifndef fake_sclose 199*6236dae4SAndroid Build Coastguard Worker #define fake_sclose(x) Curl_nop_stmt 200*6236dae4SAndroid Build Coastguard Worker #endif 201*6236dae4SAndroid Build Coastguard Worker 202*6236dae4SAndroid Build Coastguard Worker /* 203*6236dae4SAndroid Build Coastguard Worker * Curl_safefree defined as a macro to allow MemoryTracking feature 204*6236dae4SAndroid Build Coastguard Worker * to log free() calls at same location where Curl_safefree is used. 205*6236dae4SAndroid Build Coastguard Worker * This macro also assigns NULL to given pointer when free'd. 206*6236dae4SAndroid Build Coastguard Worker */ 207*6236dae4SAndroid Build Coastguard Worker 208*6236dae4SAndroid Build Coastguard Worker #define Curl_safefree(ptr) \ 209*6236dae4SAndroid Build Coastguard Worker do { free((ptr)); (ptr) = NULL;} while(0) 210*6236dae4SAndroid Build Coastguard Worker 211*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_MEMDEBUG_H */ 212