backtrace->contains_function takes multiple names, speeding up whitelist check drasti...
authorMartin Willi <martin@revosec.ch>
Mon, 17 Jan 2011 12:23:57 +0000 (13:23 +0100)
committerMartin Willi <martin@revosec.ch>
Mon, 17 Jan 2011 17:19:44 +0000 (18:19 +0100)
src/libstrongswan/utils/backtrace.c
src/libstrongswan/utils/backtrace.h
src/libstrongswan/utils/leak_detective.c

index a672451..41224e8 100644 (file)
@@ -132,10 +132,11 @@ static void log_(private_backtrace_t *this, FILE *file, bool detailed)
 /**
  * Implementation of backtrace_t.contains_function
  */
-static bool contains_function(private_backtrace_t *this, char *function)
+static bool contains_function(private_backtrace_t *this,
+                                                         char *function[], int count)
 {
 #ifdef HAVE_DLADDR
-       int i;
+       int i, j;
 
        for (i = 0; i< this->frame_count; i++)
        {
@@ -143,9 +144,12 @@ static bool contains_function(private_backtrace_t *this, char *function)
 
                if (dladdr(this->frames[i], &info) && info.dli_sname)
                {
-                       if (streq(info.dli_sname, function))
+                       for (j = 0; j < count; j++)
                        {
-                               return TRUE;
+                               if (streq(info.dli_sname, function[j]))
+                               {
+                                       return TRUE;
+                               }
                        }
                }
        }
@@ -179,7 +183,7 @@ backtrace_t *backtrace_create(int skip)
        this->frame_count = frame_count;
 
        this->public.log = (void(*)(backtrace_t*,FILE*,bool))log_;
-       this->public.contains_function = (bool(*)(backtrace_t*, char *function))contains_function;
+       this->public.contains_function = (bool(*)(backtrace_t*, char *function[], int count))contains_function;
        this->public.destroy = (void(*)(backtrace_t*))destroy;
 
        return &this->public;
index c6b0ec7..e8ccfc1 100644 (file)
@@ -41,12 +41,13 @@ struct backtrace_t {
        void (*log)(backtrace_t *this, FILE *file, bool detailed);
 
        /**
-        * Check if the backtrace contains a frame in a specific function.
+        * Check if the backtrace contains a frame having a function in a list.
         *
-        * @param               function name
-        * @return              TRUE if function is in the stack
+        * @param               function name array
+        * @param               number of elements in function array
+        * @return              TRUE if one of the functions is in the stack
         */
-       bool (*contains_function)(backtrace_t *this, char *function);
+       bool (*contains_function)(backtrace_t *this, char *function[], int count);
 
        /**
         * Destroy a backtrace instance.
index acd8b7c..a645610 100644 (file)
@@ -233,22 +233,6 @@ char *whitelist[] = {
 };
 
 /**
- * check if a stack frame contains functions listed above
- */
-static bool is_whitelisted(backtrace_t *backtrace)
-{
-       int i;
-       for (i = 0; i < sizeof(whitelist)/sizeof(char*); i++)
-       {
-               if (backtrace->contains_function(backtrace, whitelist[i]))
-               {
-                       return TRUE;
-               }
-       }
-       return FALSE;
-}
-
-/**
  * Report leaks at library destruction
  */
 static void report(private_leak_detective_t *this, bool detailed)
@@ -260,7 +244,8 @@ static void report(private_leak_detective_t *this, bool detailed)
 
                for (hdr = first_header.next; hdr != NULL; hdr = hdr->next)
                {
-                       if (is_whitelisted(hdr->backtrace))
+                       if (hdr->backtrace->contains_function(hdr->backtrace,
+                                                                                       whitelist, countof(whitelist)))
                        {
                                whitelisted++;
                        }