Hello, below the output of the test case executed in different scenarios (on uClibc-nptl for sh4) with some comments
/* CASE 1: Broken implementation of dladdr */ [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# ./dladdr dladdr() should fail info->dli_fname = (null) info->dli_fbase = 0x00000000 info->dli_sname = (null) info->dli_saddr = 0x00000000 [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# echo $? 1 /* dladdr should fail (returning 0), but it returns a value != 0, so it means that if found at least a module in which the addr falls, so dli_fname and dli_fbase should be set, while actually they are null */ /* CASE 2: Fixed dladdr, but without the loadaddr -> mapaddr fix */ [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# ./dladdr dladdr() should fail info->dli_fname = ./dladdr info->dli_fbase = 0x00000000 info->dli_sname = (null) info->dli_saddr = 0x00000000 [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# echo $? 1 /* Partially fixed: dladdr should fail (returning 0), but it returns a value != 0, so it means that if found at least a module in which the addr falls, so dli_fname and dli_fbase should be set, actually dli_fbase is set to the main application and dli_fbase is set to its loaddr, that is 0 */ [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# /* CASE 3: fully fixed, using mapaddr instead of loadaddr */ [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# ./dladdr dladdr() failed as expected [EMAIL PROTECTED]:/home/filippo/uclibc-test/dlopen# echo $? 0 /* The is not module in which the addr (1) falls */ [EMAIL PROTECTED] wrote: > Author: carmelo > Date: 2008-01-22 07:37:32 -0800 (Tue, 22 Jan 2008) > New Revision: 20884 > > Log: > Test case to exploit dladdr bug > > Signed-off-by: Filippo Arcidiacono <[EMAIL PROTECTED]> > > > Added: > trunk/uClibc/test/dlopen/dladdr.c > > Modified: > trunk/uClibc/test/dlopen/Makefile > > > Changeset: > Modified: trunk/uClibc/test/dlopen/Makefile > =================================================================== > --- trunk/uClibc/test/dlopen/Makefile 2008-01-21 13:46:01 UTC (rev 20883) > +++ trunk/uClibc/test/dlopen/Makefile 2008-01-22 15:37:32 UTC (rev 20884) > @@ -4,7 +4,7 @@ > # rules need a little love to work with glibc ... > export UCLIBC_ONLY := 1 > > -TESTS := dltest dltest2 dlstatic test1 test2 test3 dlundef dlafk > +TESTS := dltest dltest2 dlstatic test1 test2 test3 dlundef dlafk dladdr > > include ../Test.mak > > @@ -19,6 +19,7 @@ > LDFLAGS_test1 := -ldl > LDFLAGS_test2 := -ldl > LDFLAGS_test3 := -ldl ./libtest1.so ./libtest2.so -Wl,-rpath,. > +LDFLAGS_dladdr := -ldl > > DEBUG_LIBS := X > WRAPPER := env $(DEBUG_LIBS)=all > LD_LIBRARY_PATH="$$PWD:.:$(LD_LIBRARY_PATH)" > > Added: trunk/uClibc/test/dlopen/dladdr.c > =================================================================== > --- trunk/uClibc/test/dlopen/dladdr.c (rev 0) > +++ trunk/uClibc/test/dlopen/dladdr.c 2008-01-22 15:37:32 UTC (rev 20884) > @@ -0,0 +1,25 @@ > +#include <dlfcn.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include <string.h> > + > +int main(int argc, char **argv) > +{ > + Dl_info info; > + int res = 0; > + > + memset(&info, '\0', sizeof(Dl_info)); > + res = dladdr((void *)1, &info); > + if (res != 0) { > + fprintf(stderr, "dladdr() should fail\n"); > + fprintf(stderr, "dli_fname = %s\n", info.dli_fname); > + fprintf(stderr, "dli_fbase = 0x%08x\n", (unsigned int)info.dli_fbase); > + fprintf(stderr, "dli_sname = %s\n", info.dli_sname); > + fprintf(stderr, "dli_saddr = 0x%08x\n", (unsigned int)info.dli_saddr); > + exit(1); > + } > + > + fprintf(stderr, "dladdr() failed as expected\n"); > + return EXIT_SUCCESS; > +} > + > > > Property changes on: trunk/uClibc/test/dlopen/dladdr.c > ___________________________________________________________________ > Name: svn:executable > + * > > _______________________________________________ > uClibc-cvs mailing list > [EMAIL PROTECTED] > http://busybox.net/cgi-bin/mailman/listinfo/uclibc-cvs > _______________________________________________ uClibc mailing list uClibc@uclibc.org http://busybox.net/cgi-bin/mailman/listinfo/uclibc