summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/curl_memory.h16
-rw-r--r--lib/curl_setup.h1
-rw-r--r--lib/easy.c6
-rw-r--r--lib/memdebug.c28
-rw-r--r--lib/memdebug.h20
-rwxr-xr-xtests/memanalyze.pl23
-rw-r--r--tests/server/getpart.c3
7 files changed, 94 insertions, 3 deletions
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 e4d8721a0..0508ab56c 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -270,6 +270,7 @@
# endif
# endif
# include <tchar.h>
+ typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str);
#endif
/*
diff --git a/lib/easy.c b/lib/easy.c
index dc95a6d44..55144c7b9 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -197,6 +197,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.
@@ -228,6 +231,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, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, 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
@@ -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, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, 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
@@ -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(<FILE>) {
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 */