From: Jakub Jelinek <jakub@redhat.com>
To: Ulrich Drepper <drepper@redhat.com>
Cc: Glibc hackers <libc-hacker@sources.redhat.com>
Subject: [PATCH] Fix RTLD_DI_SERINFO{,SIZE} (BZ #4776)
Date: Wed, 11 Jul 2007 11:33:00 -0000 [thread overview]
Message-ID: <20070711113609.GL4603@sunsite.mff.cuni.cz> (raw)
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
reply other threads:[~2007-07-11 11:33 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070711113609.GL4603@sunsite.mff.cuni.cz \
--to=jakub@redhat.com \
--cc=drepper@redhat.com \
--cc=libc-hacker@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).