diff options
author | Ondřej Bílka <neleai@seznam.cz> | 2013-11-18 19:56:57 +0100 |
---|---|---|
committer | Ondřej Bílka <neleai@seznam.cz> | 2013-11-18 19:59:46 +0100 |
commit | b75891075bece24be9fd85618f18af4a2daf7f1c (patch) | |
tree | e9ac3fb4d864a255d977fcd4a6de78343feed08a /elf/dl-load.c | |
parent | 250c23bdd9557f8609054c7000380e1ebbd351ee (diff) | |
download | glibc-b75891075bece24be9fd85618f18af4a2daf7f1c.tar.gz glibc-b75891075bece24be9fd85618f18af4a2daf7f1c.tar.xz glibc-b75891075bece24be9fd85618f18af4a2daf7f1c.zip |
Fix breaking of RPATH when $ORIGIN contains colons. Fixes bug 10253
We first expanded origin and then split string by colons. This misbehaves when $ORIGIN contain colon so we first split string, then expand $ORIGIN.
Diffstat (limited to 'elf/dl-load.c')
-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 6a73f27345..bdd33bd78a 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); + 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) { |