]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
MemoryTracking: adjust initialization calling
authorYang Tse <yangsita@gmail.com>
Sat, 20 Aug 2011 15:26:02 +0000 (17:26 +0200)
committerYang Tse <yangsita@gmail.com>
Sat, 20 Aug 2011 15:26:42 +0000 (17:26 +0200)
Calling of curl_memdebug() was still done with a pending free()

lib/memdebug.c
lib/memdebug.h
src/main.c
tests/libtest/first.c

index 9617faf13c20a5a601ae4a0cdfa01611fd440b16..1a0a485a885e4705834c431242e02c874bbe3642 100644 (file)
@@ -119,7 +119,7 @@ static long memsize = 0;  /* set number of mallocs allowed */
 void curl_memdebug(const char *logname)
 {
   if(!logfile) {
-    if(logname)
+    if(logname && *logname)
       logfile = fopen(logname, "w");
     else
       logfile = stderr;
index b18bb39da9dc87f159fcb0dd49764452d3e9a755..02df088777be76b0cbddad455586988806d752d8 100644 (file)
 
 #include <curl/curl.h>
 
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif
 
+#define CURL_MT_LOGFNAME_BUFSIZE 512
+
 #define logfile curl_debuglogfile
 
 extern FILE *logfile;
index b24c8566fcf031145ca1cfe87a796ec471315384..3af7663d30659a57c572df50d9ba722339f373f1 100644 (file)
@@ -4617,6 +4617,38 @@ header_callback(void *ptr, size_t size, size_t nmemb, void *stream)
   return cb;
 }
 
+#ifdef CURLDEBUG
+static void memory_tracking_init(void)
+{
+  char *env;
+  /* if CURL_MEMDEBUG is set, this starts memory tracking message logging */
+  env = curlx_getenv("CURL_MEMDEBUG");
+  if(env) {
+    /* use the value as file name */
+    char fname[CURL_MT_LOGFNAME_BUFSIZE];
+    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
+      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
+    strcpy(fname, env);
+    curl_free(env);
+    curl_memdebug(fname);
+    /* this weird stuff here is to make curl_free() get called
+       before curl_memdebug() as otherwise memory tracking will
+       log a free() without an alloc! */
+  }
+  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
+  env = curlx_getenv("CURL_MEMLIMIT");
+  if(env) {
+    char *endptr;
+    long num = strtol(env, &endptr, 10);
+    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
+      curl_memlimit(num);
+    curl_free(env);
+  }
+}
+#else
+#  define memory_tracking_init(x)
+#endif
+
 static int
 operate(struct Configurable *config, int argc, argv_item_t argv[])
 {
@@ -4653,32 +4685,11 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
 
   memset(&heads, 0, sizeof(struct OutStruct));
 
-#ifdef CURLDEBUG
-  /* this sends all memory debug messages to a logfile named memdump */
-  env = curlx_getenv("CURL_MEMDEBUG");
-  if(env) {
-    /* use the value as file name */
-    char *s = strdup(env);
-    curl_free(env);
-    curl_memdebug(s);
-    free(s);
-    /* this weird strdup() and stuff here is to make the curl_free() get
-       called before the memdebug() as otherwise the memdebug tracing will
-       with tracing a free() without an alloc! */
-  }
-  env = curlx_getenv("CURL_MEMLIMIT");
-  if(env) {
-    char *endptr;
-    long num = strtol(env, &endptr, 10);
-    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
-      curl_memlimit(num);
-    curl_free(env);
-  }
-#endif
+  memory_tracking_init();
 
   /* Initialize curl library - do not call any libcurl functions before.
-     Note that the CURLDEBUG magic above is an exception, but then that's not
-     part of the official public API.
+     Note that the memory_tracking_init() magic above is an exception, but
+     then that's not part of the official public API.
   */
   if(main_init() != CURLE_OK) {
     helpf(config->errors, "error initializing curl library\n");
index 205d3943ffa2deec0a207a11f88fd03a31284e45..3785fd997a2002897fb054a97697682e017f8538 100644 (file)
@@ -54,24 +54,25 @@ char **test_argv;
 int unitfail; /* for unittests */
 #endif
 
-int main(int argc, char **argv)
-{
-  char *URL;
-
 #ifdef CURLDEBUG
-  /* this sends all memory debug messages to a logfile named memdump */
-  char *env = curl_getenv("CURL_MEMDEBUG");
+static void memory_tracking_init(void)
+{
+  char *env;
+  /* if CURL_MEMDEBUG is set, this starts memory tracking message logging */
+  env = curl_getenv("CURL_MEMDEBUG");
   if(env) {
     /* use the value as file name */
-    char *s = strdup(env);
+    char fname[CURL_MT_LOGFNAME_BUFSIZE];
+    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
+      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
+    strcpy(fname, env);
     curl_free(env);
-    curl_memdebug(s);
-    free(s);
-    /* this weird strdup() and stuff here is to make the curl_free() get
-       called before the memdebug() as otherwise the memdebug tracing will
-       with tracing a free() without an alloc! */
+    curl_memdebug(fname);
+    /* this weird stuff here is to make curl_free() get called
+       before curl_memdebug() as otherwise memory tracking will
+       log a free() without an alloc! */
   }
-  /* this enables the fail-on-alloc-number-N functionality */
+  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
   env = curl_getenv("CURL_MEMLIMIT");
   if(env) {
     char *endptr;
@@ -80,8 +81,17 @@ int main(int argc, char **argv)
       curl_memlimit(num);
     curl_free(env);
   }
+}
+#else
+#  define memory_tracking_init(x)
 #endif
 
+int main(int argc, char **argv)
+{
+  char *URL;
+
+  memory_tracking_init();
+
   /*
    * Setup proper locale from environment. This is needed to enable locale-
    * specific behaviour by the C library in order to test for undesired side