backtrace->contains_function takes multiple names, speeding up whitelist check drastically

This commit is contained in:
Martin Willi
2011-01-17 18:19:44 +01:00
parent ec8426a349
commit b94feb4b05
3 changed files with 16 additions and 26 deletions
+9 -5
View File
@@ -132,10 +132,11 @@ static void log_(private_backtrace_t *this, FILE *file, bool detailed)
/** /**
* Implementation of backtrace_t.contains_function * 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 #ifdef HAVE_DLADDR
int i; int i, j;
for (i = 0; i< this->frame_count; i++) 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 (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->frame_count = frame_count;
this->public.log = (void(*)(backtrace_t*,FILE*,bool))log_; 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; this->public.destroy = (void(*)(backtrace_t*))destroy;
return &this->public; return &this->public;
+5 -4
View File
@@ -41,12 +41,13 @@ struct backtrace_t {
void (*log)(backtrace_t *this, FILE *file, bool detailed); 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 * @param function name array
* @return TRUE if function is in the stack * @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. * Destroy a backtrace instance.
+2 -17
View File
@@ -232,22 +232,6 @@ char *whitelist[] = {
"gpg_err_init", "gpg_err_init",
}; };
/**
* 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 * Report leaks at library destruction
*/ */
@@ -260,7 +244,8 @@ static void report(private_leak_detective_t *this, bool detailed)
for (hdr = first_header.next; hdr != NULL; hdr = hdr->next) 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++; whitelisted++;
} }