diff --git a/lib/curl_memory.h b/lib/curl_memory.h index c1e92513f..4bba008c9 100644 --- a/lib/curl_memory.h +++ b/lib/curl_memory.h @@ -87,6 +87,9 @@ extern curl_free_callback Curl_cfree; extern curl_realloc_callback Curl_crealloc; extern curl_strdup_callback Curl_cstrdup; extern curl_calloc_callback Curl_ccalloc; +#ifdef WIN32 +extern curl_wcsdup_callback Curl_cwcsdup; +#endif #ifndef CURLDEBUG @@ -110,6 +113,19 @@ extern curl_calloc_callback Curl_ccalloc; #undef free #define free(ptr) Curl_cfree(ptr) +#ifdef WIN32 +# undef wcsdup +# define wcsdup(ptr) Curl_cwcsdup(ptr) +# undef _wcsdup +# define _wcsdup(ptr) Curl_cwcsdup(ptr) +# undef _tcsdup +# ifdef UNICODE +# define _tcsdup(ptr) Curl_cwcsdup(ptr) +# else +# define _tcsdup(ptr) Curl_cstrdup(ptr) +# endif +#endif + #endif /* CURLDEBUG */ #else /* CURLX_NO_MEMORY_CALLBACKS */ diff --git a/lib/curl_setup.h b/lib/curl_setup.h index a46a60828..3f55a5c0f 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -270,6 +270,7 @@ # endif # endif # include + typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str); #endif /* diff --git a/lib/easy.c b/lib/easy.c index b82a548cb..541e793fb 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -252,6 +252,9 @@ curl_free_callback Curl_cfree = (curl_free_callback)free; curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc; curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)system_strdup; curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc; +#ifdef WIN32 +curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)wcsdup; +#endif #else /* * Symbian OS doesn't support initialization to code in writeable static data. @@ -283,6 +286,9 @@ CURLcode curl_global_init(long flags) Curl_crealloc = (curl_realloc_callback)realloc; Curl_cstrdup = (curl_strdup_callback)system_strdup; Curl_ccalloc = (curl_calloc_callback)calloc; +#ifdef WIN32 + Curl_cwcsdup = (curl_wcsdup_callback)wcsdup; +#endif if(flags & CURL_GLOBAL_SSL) if(!Curl_ssl_init()) { diff --git a/lib/memdebug.c b/lib/memdebug.c index 4d5f44d2f..b3ddfb430 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -239,6 +239,32 @@ char *curl_dostrdup(const char *str, int line, const char *source) return mem; } +#ifdef WIN32 +wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source) +{ + wchar_t *mem; + size_t wsiz, bsiz; + + assert(str != NULL); + + if(countcheck("wcsdup", line, source)) + return NULL; + + wsiz = wcslen(str) + 1; + bsiz = wsiz * sizeof(wchar_t); + + mem = curl_domalloc(bsiz, 0, NULL); /* NULL prevents logging */ + if(mem) + memcpy(mem, str, bsiz); + + if(source) + curl_memlog("MEM %s:%d wcsdup(%p) (%zu) = %p\n", + source, line, str, bsiz, mem); + + return mem; +} +#endif + /* We provide a realloc() that accepts a NULL as pointer, which then performs a malloc(). In order to work with ares. */ void *curl_dorealloc(void *ptr, size_t wantedsize, diff --git a/lib/memdebug.h b/lib/memdebug.h index fbeb61de5..955e8b72b 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -8,7 +8,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -46,6 +46,11 @@ CURL_EXTERN void *curl_dorealloc(void *ptr, size_t size, int line, const char *source); CURL_EXTERN void curl_dofree(void *ptr, int line, const char *source); CURL_EXTERN char *curl_dostrdup(const char *str, int line, const char *source); +#ifdef WIN32 +CURL_EXTERN wchar_t *curl_dowcsdup(const wchar_t *str, int line, + const char *source); +#endif + CURL_EXTERN void curl_memdebug(const char *logname); CURL_EXTERN void curl_memlimit(long limit); CURL_EXTERN void curl_memlog(const char *format, ...); @@ -84,6 +89,19 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); #define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__) #define free(ptr) curl_dofree(ptr, __LINE__, __FILE__) +#ifdef WIN32 +# undef wcsdup +# define wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# undef _wcsdup +# define _wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# undef _tcsdup +# ifdef UNICODE +# define _tcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) +# else +# define _tcsdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) +# endif +#endif + #define socket(domain,type,protocol)\ curl_socket(domain,type,protocol,__LINE__,__FILE__) #undef accept /* for those with accept as a macro */ diff --git a/tests/memanalyze.pl b/tests/memanalyze.pl index 524634969..54117f8ea 100755 --- a/tests/memanalyze.pl +++ b/tests/memanalyze.pl @@ -31,6 +31,7 @@ my $mallocs=0; my $callocs=0; my $reallocs=0; my $strdups=0; +my $wcsdups=0; my $showlimit; while(1) { @@ -220,6 +221,25 @@ while() { newtotal($totalmem); $strdups++; } + elsif($function =~ /wcsdup\(0x([0-9a-f]*)\) \((\d*)\) = 0x([0-9a-f]*)/) { + # wcsdup(a5b50) (8) = df7c0 + + $dup = $1; + $size = $2; + $addr = $3; + $getmem{$addr}="$source:$linenum"; + $sizeataddr{$addr}=$size; + + $totalmem += $size; + + if($trace) { + printf("WCSDUP: $size bytes at %s, makes totally: %d bytes\n", + $getmem{$addr}, $totalmem); + } + + newtotal($totalmem); + $wcsdups++; + } else { print "Not recognized input line: $function\n"; } @@ -378,8 +398,9 @@ if($verbose) { "Reallocs: $reallocs\n", "Callocs: $callocs\n", "Strdups: $strdups\n", + "Wcsdups: $wcsdups\n", "Frees: $frees\n", - "Allocations: ".($mallocs + $callocs + $reallocs + $strdups)."\n"; + "Allocations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups)."\n"; print "Maximum allocated: $maxmem\n"; } diff --git a/tests/server/getpart.c b/tests/server/getpart.c index f37f88cba..188eb5dca 100644 --- a/tests/server/getpart.c +++ b/tests/server/getpart.c @@ -58,6 +58,9 @@ curl_free_callback Curl_cfree = (curl_free_callback)free; curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc; curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)strdup; curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc; +#ifdef WIN32 +curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)wcsdup; +#endif #if defined(_MSC_VER) && defined(_DLL) # pragma warning(default:4232) /* MSVC extension, dllimport identity */