| commit 2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9 |
| Author: Ondřej Bílka <neleai@seznam.cz> |
| Date: Mon Dec 2 14:53:14 2013 +0100 |
| |
| Return fixed version of breaking of RPATH when $ORIGIN contains colons |
| |
| |
| |
| |
| |
| @@ -487,14 +487,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 |
| @@ -515,7 +520,10 @@ fillin_rpath (char *rpath, struct r_sear |
| |
| /* 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) |
| @@ -576,6 +584,7 @@ fillin_rpath (char *rpath, struct r_sear |
| /* Put it in the result array. */ |
| result[nelems++] = dirp; |
| } |
| + free (to_free); |
| } |
| |
| /* Terminate the array. */ |
| @@ -631,9 +640,8 @@ decompose_rpath (struct r_search_path_st |
| 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"); |
| @@ -666,7 +674,7 @@ decompose_rpath (struct r_search_path_st |
| _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. */ |
| @@ -714,9 +722,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) |
| { |