proper leak detective hook for realloc
excluded pthread_setspecific from leak detective
This commit is contained in:
@@ -280,8 +280,7 @@ void free_hook(void *ptr, const void *caller)
|
|||||||
*/
|
*/
|
||||||
void *realloc_hook(void *old, size_t bytes, const void *caller)
|
void *realloc_hook(void *old, size_t bytes, const void *caller)
|
||||||
{
|
{
|
||||||
void *new;
|
memory_header_t *hdr;
|
||||||
memory_header_t *hdr = old - sizeof(memory_header_t);
|
|
||||||
void *stack_frames[STACK_FRAMES_COUNT];
|
void *stack_frames[STACK_FRAMES_COUNT];
|
||||||
int stack_frame_count;
|
int stack_frame_count;
|
||||||
|
|
||||||
@@ -290,6 +289,10 @@ void *realloc_hook(void *old, size_t bytes, const void *caller)
|
|||||||
{
|
{
|
||||||
return malloc_hook(bytes, caller);
|
return malloc_hook(bytes, caller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hdr = old - sizeof(memory_header_t);
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
uninstall_hooks();
|
||||||
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
||||||
{
|
{
|
||||||
logger->log(logger, ERROR, "reallocation of invalid memory (%p)", old);
|
logger->log(logger, ERROR, "reallocation of invalid memory (%p)", old);
|
||||||
@@ -299,15 +302,23 @@ void *realloc_hook(void *old, size_t bytes, const void *caller)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* malloc and free is done with hooks */
|
hdr = realloc(hdr, bytes + sizeof(memory_header_t));
|
||||||
new = malloc_hook(bytes, caller);
|
|
||||||
memcpy(new, old, min(bytes, hdr->bytes));
|
|
||||||
free_hook(old, caller);
|
|
||||||
|
|
||||||
return new;
|
/* update statistics */
|
||||||
|
hdr->bytes = bytes;
|
||||||
|
hdr->stack_frame_count = backtrace(hdr->stack_frames, STACK_FRAMES_COUNT);
|
||||||
|
|
||||||
|
/* update header of linked list neighbours */
|
||||||
|
if (hdr->next)
|
||||||
|
{
|
||||||
|
hdr->next->previous = hdr;
|
||||||
|
}
|
||||||
|
hdr->previous->next = hdr;
|
||||||
|
install_hooks();
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
return hdr + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup leak detective
|
* Setup leak detective
|
||||||
*/
|
*/
|
||||||
@@ -349,6 +360,7 @@ struct excluded_function {
|
|||||||
{"libc.so.6", "mktime", NULL, NULL},
|
{"libc.so.6", "mktime", NULL, NULL},
|
||||||
{"libc.so.6", "vsyslog", NULL, NULL},
|
{"libc.so.6", "vsyslog", NULL, NULL},
|
||||||
{"libc.so.6", "strerror", NULL, NULL},
|
{"libc.so.6", "strerror", NULL, NULL},
|
||||||
|
{"libpthread.so.0", "pthread_setspecific", NULL, NULL},
|
||||||
};
|
};
|
||||||
#define INET_NTOA 0
|
#define INET_NTOA 0
|
||||||
#define PTHREAD_CREATE 1
|
#define PTHREAD_CREATE 1
|
||||||
@@ -359,7 +371,7 @@ struct excluded_function {
|
|||||||
#define MKTIME 6
|
#define MKTIME 6
|
||||||
#define VSYSLOG 7
|
#define VSYSLOG 7
|
||||||
#define STRERROR 8
|
#define STRERROR 8
|
||||||
|
#define PTHREAD_SETSPECIFIC 9
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load libraries and function pointers for excluded functions
|
* Load libraries and function pointers for excluded functions
|
||||||
@@ -439,6 +451,21 @@ int pthread_cancel(pthread_t __th)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pthread_setspecific(pthread_key_t __key, __const void *__pointer)
|
||||||
|
{
|
||||||
|
int (*_pthread_setspecific) (pthread_key_t,__const void*) = excluded_functions[PTHREAD_SETSPECIFIC].lib_function;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
uninstall_hooks();
|
||||||
|
|
||||||
|
result = _pthread_setspecific(__key, __pointer);
|
||||||
|
|
||||||
|
install_hooks();
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// /* TODO: join has probs, since it dellocates memory
|
// /* TODO: join has probs, since it dellocates memory
|
||||||
// * allocated (somewhere) with leak_detective :-(.
|
// * allocated (somewhere) with leak_detective :-(.
|
||||||
// * We should exclude all pthread_ functions to fix it !? */
|
// * We should exclude all pthread_ functions to fix it !? */
|
||||||
|
|||||||
Reference in New Issue
Block a user