diff options
author | Ondřej Bílka <neleai@seznam.cz> | 2013-12-02 14:53:14 +0100 |
---|---|---|
committer | Ondřej Bílka <neleai@seznam.cz> | 2013-12-02 14:53:14 +0100 |
commit | 2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9 (patch) | |
tree | 4835e110fd737052d708f9b0c9a94a0414940cd5 /elf | |
parent | 1ab19dec57a3591dac3afbc49a6dd638edd57e4d (diff) | |
download | glibc-2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9.zip glibc-2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9.tar.gz glibc-2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9.tar.bz2 |
Return fixed version of breaking of RPATH when $ORIGIN contains colons
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-load.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 6a73f27..d3e1cf8 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -481,14 +481,19 @@ static size_t max_dirnamelen; static struct r_search_path_elem ** fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep, - int check_trusted, const char *what, const char *where) + int check_trusted, const char *what, const char *where, + struct link_map *l) { char *cp; size_t nelems = 0; + char *to_free; while ((cp = __strsep (&rpath, sep)) != NULL) { struct r_search_path_elem *dirp; + + to_free = cp = expand_dynamic_string_token (l, cp, 1); + size_t len = strlen (cp); /* `strsep' can pass an empty string. This has to be @@ -509,7 +514,10 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep, /* Make sure we don't use untrusted directories if we run SUID. */ if (__builtin_expect (check_trusted, 0) && !is_trusted_path (cp, len)) - continue; + { + free (to_free); + continue; + } /* See if this directory is already known. */ for (dirp = GL(dl_all_dirs); dirp != NULL; dirp = dirp->next) @@ -570,6 +578,7 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep, /* Put it in the result array. */ result[nelems++] = dirp; } + free (to_free); } /* Terminate the array. */ @@ -625,9 +634,8 @@ decompose_rpath (struct r_search_path_struct *sps, while (*inhp != '\0'); } - /* Make a writable copy. At the same time expand possible dynamic - string tokens. */ - copy = expand_dynamic_string_token (l, rpath, 1); + /* Make a writable copy. */ + copy = local_strdup (rpath); if (copy == NULL) { errstring = N_("cannot create RUNPATH/RPATH copy"); @@ -660,7 +668,7 @@ decompose_rpath (struct r_search_path_struct *sps, _dl_signal_error (ENOMEM, NULL, NULL, errstring); } - fillin_rpath (copy, result, ":", 0, what, where); + fillin_rpath (copy, result, ":", 0, what, where, l); /* Free the copied RPATH string. `fillin_rpath' make own copies if necessary. */ @@ -708,9 +716,7 @@ _dl_init_paths (const char *llp) const char *strp; struct r_search_path_elem *pelem, **aelem; size_t round_size; -#ifdef SHARED - struct link_map *l; -#endif + struct link_map __attribute__ ((unused)) *l = NULL; /* Initialize to please the compiler. */ const char *errstring = NULL; @@ -865,7 +871,7 @@ _dl_init_paths (const char *llp) (void) fillin_rpath (llp_tmp, env_path_list.dirs, ":;", INTUSE(__libc_enable_secure), "LD_LIBRARY_PATH", - NULL); + NULL, l); if (env_path_list.dirs[0] == NULL) { |