This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix RTLD_DI_SERINFO{,SIZE} (BZ #4776)


Hi!

Current directory (from empty library search path elements in
LD_LIBRARY_PATH, DT_R{UN,}PATH) has r->dirnamelen == 0 and thus
mempcpy , r->dirnamelen - 1) crashes on it.  While fixing this
I have noticed that searchpath elements / (the only ones that
can have dirnamelen == 1) result in "" strings, which is confusing
too.

2007-07-11  Jakub Jelinek  <jakub@redhat.com>

	[BZ #4776]
	* elf/dl-load.c (_dl_rtld_di_serinfo): Output / in LD_LIBRARY_PATH,
	RPATH etc. as "/" rather than "", don't segfault on empty paths,
	instead output ".".
	* dlfcn/Makefile (distribute): Add glreflib3.c.
	(module-names): Add glreflib3.
	($(objpfx)tst-dlinfo.out): Depend on glreflib3.so rather than
	glreflib1.so.
	(LDFLAGS_glreflib3.so): New.
	* dlfcn/tst-dlinfo.c (do_test): Load glreflib3.so instead of
	glreflib1.so.
	* dlfcn/glreflib3.c: New file.

--- libc/elf/dl-load.c.jj	2007-07-03 12:36:59.000000000 +0200
+++ libc/elf/dl-load.c	2007-07-11 13:21:18.000000000 +0200
@@ -2273,14 +2273,17 @@ _dl_rtld_di_serinfo (struct link_map *lo
 	      if (counting)
 		{
 		  si->dls_cnt++;
-		  si->dls_size += r->dirnamelen;
+		  si->dls_size += r->dirnamelen < 2 ? r->dirnamelen : 2;
 		}
 	      else
 		{
 		  Dl_serpath *const sp = &si->dls_serpath[idx++];
 		  sp->dls_name = allocptr;
-		  allocptr = __mempcpy (allocptr,
-					r->dirname, r->dirnamelen - 1);
+		  if (r->dirnamelen < 2)
+		    *allocptr++ = r->dirnamelen ? '/' : '.';
+		  else
+		    allocptr = __mempcpy (allocptr,
+					  r->dirname, r->dirnamelen - 1);
 		  *allocptr++ = '\0';
 		  sp->dls_flags = flags;
 		}
--- libc/dlfcn/Makefile.jj	2006-10-31 23:05:28.000000000 +0100
+++ libc/dlfcn/Makefile	2007-07-11 13:12:07.000000000 +0200
@@ -23,7 +23,8 @@ libdl-routines	:= dlopen dlclose dlsym d
 		   dlmopen dlfcn
 routines	:= $(patsubst %,s%,$(filter-out dlfcn,$(libdl-routines)))
 elide-routines.os := $(routines)
-distribute	:= dlopenold.c glreflib1.c glreflib2.c failtestmod.c \
+distribute	:= dlopenold.c glreflib1.c glreflib2.c glreflib3.c \
+		   failtestmod.c \
 		   defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \
 		   modcxaatexit.c modstatic.c modstatic2.c \
 		   bug-dlsym1-lib1.c bug-dlsym1-lib2.c bug-atexit1-lib.c \
@@ -43,8 +44,8 @@ tests = glrefmain failtest tst-dladdr de
 	bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \
 	bug-atexit3 tstatexit
 endif
-modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \
-		errmsg1mod modatexit modcxaatexit \
+modules-names = glreflib1 glreflib2 glreflib3 failtestmod defaultmod1 \
+		defaultmod2 errmsg1mod modatexit modcxaatexit \
 		bug-dlsym1-lib1 bug-dlsym1-lib2 bug-atexit1-lib \
 		bug-atexit2-lib bug-atexit3-lib
 
@@ -83,7 +84,8 @@ $(objpfx)tst-dladdr: $(libdl)
 $(objpfx)tst-dladdr.out: $(objpfx)glreflib1.so
 
 $(objpfx)tst-dlinfo: $(libdl)
-$(objpfx)tst-dlinfo.out: $(objpfx)glreflib1.so
+$(objpfx)tst-dlinfo.out: $(objpfx)glreflib3.so
+LDFLAGS-glreflib3.so = -Wl,-rpath,:
 
 LDFLAGS-default = $(LDFLAGS-rdynamic)
 $(objpfx)default: $(libdl) $(objpfx)defaultmod1.so $(objpfx)defaultmod2.so
--- libc/dlfcn/tst-dlinfo.c.jj	2003-03-16 00:14:48.000000000 +0100
+++ libc/dlfcn/tst-dlinfo.c	2007-07-11 13:13:41.000000000 +0200
@@ -29,7 +29,7 @@ do_test (void)
 {
   int status = 0;
 
-  void *handle = dlopen ("glreflib1.so", RTLD_NOW);
+  void *handle = dlopen ("glreflib3.so", RTLD_NOW);
   if (handle == NULL)
     error (EXIT_FAILURE, 0, "cannot load: glreflib1.so: %s", dlerror ());
 
--- libc/dlfcn/glreflib3.c.jj	2007-07-11 13:10:12.000000000 +0200
+++ libc/dlfcn/glreflib3.c	2007-07-11 13:10:06.000000000 +0200
@@ -0,0 +1 @@
+#include "glreflib1.c"

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]