backtrace->contains_function takes multiple names, speeding up whitelist check drastically
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user