]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
leak-detective: LEAK_DETECTIVE_DISABLE completely disables LD
authorTobias Brunner <tobias@strongswan.org>
Tue, 1 Apr 2014 08:30:13 +0000 (10:30 +0200)
committerTobias Brunner <tobias@strongswan.org>
Thu, 3 Apr 2014 07:44:26 +0000 (09:44 +0200)
If lib->leak_detective is non-null some code parts (e.g. the plugin
loader) assume LD is actually used.

src/libstrongswan/library.c
src/libstrongswan/utils/leak_detective.c
src/libstrongswan/utils/leak_detective.h

index 8472c30a583ff2f98739bf4b5e5b447fb65198bd..c5bb4cd93ee6fa098e480fd75f1919cd15f4c380 100644 (file)
@@ -265,8 +265,11 @@ bool library_init(char *settings, const char *namespace)
 
 #ifdef LEAK_DETECTIVE
        lib->leak_detective = leak_detective_create();
-       lib->leak_detective->set_report_cb(lib->leak_detective,
-                                                                          report_leaks, sum_leaks, NULL);
+       if (lib->leak_detective)
+       {
+               lib->leak_detective->set_report_cb(lib->leak_detective,
+                                                                                  report_leaks, sum_leaks, NULL);
+       }
 #endif /* LEAK_DETECTIVE */
 
        pfh = printf_hook_create();
index 82eadcb970a83bcefa0963131da850717fd4a375..af29e2100917c32d2e4f7bc13810b4b88184ae3a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Tobias Brunner
+ * Copyright (C) 2013-2014 Tobias Brunner
  * Copyright (C) 2006-2013 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -973,17 +973,20 @@ leak_detective_t *leak_detective_create()
                },
        );
 
+       if (getenv("LEAK_DETECTIVE_DISABLE") != NULL)
+       {
+               free(this);
+               return NULL;
+       }
+
        lock = spinlock_create();
        thread_disabled = thread_value_create(NULL);
 
        init_static_allocations();
 
-       if (getenv("LEAK_DETECTIVE_DISABLE") == NULL)
+       if (register_hooks())
        {
-               if (register_hooks())
-               {
-                       enable_leak_detective();
-               }
+               enable_leak_detective();
        }
        return &this->public;
 }
index 3fd0b8c931a77dbc70dabe210215596300562049..ca70067d40fa38bce82704afbab8e803c3758667 100644 (file)
@@ -50,9 +50,7 @@ typedef void (*leak_detective_summary_cb_t)(void* user, int count, size_t bytes,
                                                                                    int whitelisted);
 
 /**
- * Leak detective finds leaks and bad frees using malloc hooks.
- *
- * Currently leaks are reported to stderr on destruction.
+ * Leak detective finds leaks and invalid frees using malloc hooks.
  *
  * @todo Build an API for leak detective, allowing leak enumeration, statistics
  * and dynamic whitelisting.
@@ -62,13 +60,12 @@ struct leak_detective_t {
        /**
         * Report leaks to the registered callback functions.
         *
-        * @param detailed              TRUE to resolve line/filename of leak (slow)
+        * @param detailed              TRUE to resolve line/filename of leaks (slow)
         */
        void (*report)(leak_detective_t *this, bool detailed);
 
        /**
-        * Report current memory usage to out.
-        * Set callback functions invoked during a report().
+        * Set callback functions invoked when report() is called.
         *
         * @param cb                    callback invoked for each detected leak
         * @param scb                   summary callback invoked at end of report
@@ -78,11 +75,11 @@ struct leak_detective_t {
                                                  leak_detective_summary_cb_t scb, void *user);
 
        /**
-        * Report current memory usage using a callbacks.
+        * Report current memory usage using callback functions.
         *
         * @param cb                    callback invoked for each allocation
         * @param scb                   summary callback invoked at end of usage report
-        * @param user                  user data supplied to callbacks
+        * @param user                  user data to supply to callbacks
         */
        void (*usage)(leak_detective_t *this, leak_detective_report_cb_t cb,
                                  leak_detective_summary_cb_t scb, void *user);
@@ -109,7 +106,10 @@ struct leak_detective_t {
 };
 
 /**
- * Create a leak_detective instance.
+ * Create a leak_detective instance, unless the LEAK_DETECTIVE_DISABLE
+ * environment variable is set.
+ *
+ * @return                                     leak detective instance
  */
 leak_detective_t *leak_detective_create();