Date: Tue, 13 Mar 2012 11:08:40 +0100 From: Alexandre Martins <alexandre.martins@netasq.com> To: freebsd-current@freebsd.org Cc: Konstantin Belousov <kostikbel@gmail.com> Subject: Re: Double free() in libc or gdb ? Message-ID: <201203131108.43815.alexandre.martins@netasq.com> In-Reply-To: <20120312175555.GE75778@deviant.kiev.zoral.com.ua> References: <201203121750.36937.alexandre.martins@netasq.com> <20120312175555.GE75778@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 12 March 2012 18:55:55 Konstantin Belousov wrote:
> On Mon, Mar 12, 2012 at 05:50:33PM +0100, Alexandre Martins wrote:
> > Dear all,
> >
> > I'm currently having some trouble with the dynamic loader.
> >
> > I have the libc compilled with "MALLOC_DEBUG" flag to detect double free.
> > When i run this piece of code (attached file) thought GDB, i have this
> > assertion :
> >
> > Assertion failed: ((run->regs_mask[elm] & (1U << bit)) == 0), function
> > arena_run_reg_dalloc, file /usr/src/lib/libc/stdlib/malloc.c, line 2543.
> >
> > But when i run the same binary without GDB, no assert.
> >
> > I'm very confused. Can you help me to debug that ?
>
> There is no attachment. Put the source somewhere on web.
Sorry, I'll past code here :
first.c:
____________________
#include <stdio.h>
void print_name(void)
{
printf("I'm " __FILE__ " at line %d\n", __LINE__);
}
____________________
second.c
____________________
#include <stdio.h>
void second_name(void)
{
printf("I'm " __FILE__ " at line %d\n", __LINE__);
}
void print_name(void)
{
printf("I'm " __FILE__ " at line %d\n", __LINE__);
}
____________________
main.c
____________________
#include <stdio.h>
#include <dlfcn.h>
extern void print_name(void);
int main(int argc, char *argv[])
{
void (*second_name)(void);
void *handle;
int count = 0;
while(42)
{
print_name();
handle = dlopen("second.so", RTLD_NOW);
print_name();
if (handle != NULL)
{
second_name = dlsym(handle, "second_name");
if (second_name != NULL)
{
printf("second : ");
second_name();
}
dlclose(handle);
}
else
fprintf(stderr, "Error : %s\n", dlerror());
}
}
____________________
Compilation and execution :
gcc -shared -O0 -g second.c -o second.so
gcc -shared -O0 -g first.c -o libfirst.so
gcc -O0 -g toto.c -lfirst -L. -o test
export LD_LIBRARY_PATH=$PWD
gdb ./test
Thank you for your help
--
Alexandre Martins
NETASQ -- We secure IT
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203131108.43815.alexandre.martins>
