* [2.25 COMMITTED] elf: do not substitute dst in $LD_LIBRARY_PATH twice [BZ #22627]
@ 2017-01-01 0:00 Dmitry V. Levin
0 siblings, 0 replies; only message in thread
From: Dmitry V. Levin @ 2017-01-01 0:00 UTC (permalink / raw)
To: libc-stable
Starting with commit
glibc-2.18.90-470-g2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9 that
introduced substitution of dynamic string tokens in fillin_rpath,
_dl_init_paths invokes _dl_dst_substitute for $LD_LIBRARY_PATH twice:
the first time it's called directly, the second time the result
is passed on to fillin_rpath which calls expand_dynamic_string_token
which in turn calls _dl_dst_substitute, leading to the following
behaviour:
$ mkdir -p /tmp/'$ORIGIN' && cd /tmp/'$ORIGIN' &&
echo 'int main(){}' |gcc -xc - &&
strace -qq -E LD_LIBRARY_PATH='$ORIGIN' -e /open ./a.out
open("/tmp//tmp/$ORIGIN/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
Fix this by removing the direct _dl_dst_substitute invocation.
* elf/dl-load.c (_dl_init_paths): Remove _dl_dst_substitute preparatory
code and invocation.
(cherry picked from commit bb195224acc14724e9fc2dbaa8d0b20b72ace79b)
---
ChangeLog | 6 ++++++
NEWS | 1 +
elf/dl-load.c | 20 +-------------------
3 files changed, 8 insertions(+), 19 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 1868c7a..6677169 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-12-18 Dmitry V. Levin <ldv@altlinux.org>
+
+ [BZ #22627]
+ * elf/dl-load.c (_dl_init_paths): Remove _dl_dst_substitute preparatory
+ code and invocation.
+
2017-12-14 Florian Weimer <fweimer@redhat.com>
[BZ #22607]
diff --git a/NEWS b/NEWS
index 2c4c9d6..7289adb 100644
--- a/NEWS
+++ b/NEWS
@@ -53,6 +53,7 @@ The following bugs are resolved with this release:
[21778] Robust mutex may deadlock
[21972] assert macro requires operator== (int) for its argument type
[22322] libc: [mips64] wrong bits/long-double.h installed
+ [22627] $ORIGIN in $LD_LIBRARY_PATH is substituted twice
\f
Version 2.25
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 92303b0..ec8cefb 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -776,25 +776,7 @@ _dl_init_paths (const char *llp)
if (llp != NULL && *llp != '\0')
{
- char *llp_tmp;
-
-#ifdef SHARED
- /* Expand DSTs. */
- size_t cnt = DL_DST_COUNT (llp, 1);
- if (__glibc_likely (cnt == 0))
- llp_tmp = strdupa (llp);
- else
- {
- /* Determine the length of the substituted string. */
- size_t total = DL_DST_REQUIRED (l, llp, strlen (llp), cnt);
-
- /* Allocate the necessary memory. */
- llp_tmp = (char *) alloca (total + 1);
- llp_tmp = _dl_dst_substitute (l, llp, llp_tmp, 1);
- }
-#else
- llp_tmp = strdupa (llp);
-#endif
+ char *llp_tmp = strdupa (llp);
/* Decompose the LD_LIBRARY_PATH contents. First determine how many
elements it has. */
--
ldv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-12-22 17:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-01 0:00 [2.25 COMMITTED] elf: do not substitute dst in $LD_LIBRARY_PATH twice [BZ #22627] Dmitry V. Levin
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).