diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2011-04-09 14:55:26 -0400 |
---|---|---|
committer | Ryan S. Arnold <rsa@us.ibm.com> | 2011-05-03 17:08:20 -0500 |
commit | cc390a1f1508a79ba7a4d5bb2f04c161a4b45bd9 (patch) | |
tree | ce2993672815e2d7e154f21bab07d2d65a66f5cc | |
parent | c2b8191991e549895215d44a32fba567d747af90 (diff) | |
download | glibc-cc390a1f1508a79ba7a4d5bb2f04c161a4b45bd9.tar.gz glibc-cc390a1f1508a79ba7a4d5bb2f04c161a4b45bd9.tar.xz glibc-cc390a1f1508a79ba7a4d5bb2f04c161a4b45bd9.zip |
Don't leave empty element in rpath when skipping an element
(cherry picked from commit 34fe483e121660aff222ec1c15d57804f64191ea)
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | elf/dl-load.c | 24 |
2 files changed, 29 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 5d637da9d4..bb98ede6c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2011-03-14 Andreas Schwab <schwab@redhat.com> + + * elf/dl-load.c (_dl_dst_substitute): When skipping the first + rpath element also skip the following colon. + (expand_dynamic_string_token): Add is_path parameter and pass + down to DL_DST_REQUIRED and _dl_dst_substitute. + (decompose_rpath): Call expand_dynamic_string_token with + non-zero is_path. Ignore empty rpaths. + (_dl_map_object_from_fd): Call expand_dynamic_string_token + with zero is_path. + 2011-03-28 Andreas Schwab <schwab@linux-m68k.org> * sysdeps/powerpc/powerpc32/power4/strncmp.S: Don't read past diff --git a/elf/dl-load.c b/elf/dl-load.c index 41b5ce7691..b7d34014d6 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1,5 +1,5 @@ /* Map in a shared object's segments from the file. - Copyright (C) 1995-2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1995-2005, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -284,6 +284,10 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, name += len; while (*name != '\0' && (!is_path || *name != ':')) ++name; + /* Also skip following colon if this is the first rpath + element, but keep an empty element at the end. */ + if (wp == result && is_path && *name == ':' && name[1] != '\0') + ++name; } else /* No DST we recognize. */ @@ -310,7 +314,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, belonging to the map is loaded. In this case the path element containing $ORIGIN is left out. */ static char * -expand_dynamic_string_token (struct link_map *l, const char *s) +expand_dynamic_string_token (struct link_map *l, const char *s, int is_path) { /* We make two runs over the string. First we determine how large the resulting string is and then we copy it over. Since this is no @@ -321,7 +325,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s) char *result; /* Determine the number of DST elements. */ - cnt = DL_DST_COUNT (s, 1); + cnt = DL_DST_COUNT (s, is_path); /* If we do not have to replace anything simply copy the string. */ if (__builtin_expect (cnt, 0) == 0) @@ -335,7 +339,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s) if (result == NULL) return NULL; - return _dl_dst_substitute (l, s, result, 1); + return _dl_dst_substitute (l, s, result, is_path); } @@ -551,13 +555,21 @@ decompose_rpath (struct r_search_path_struct *sps, /* Make a writable copy. At the same time expand possible dynamic string tokens. */ - copy = expand_dynamic_string_token (l, rpath); + copy = expand_dynamic_string_token (l, rpath, 1); if (copy == NULL) { errstring = N_("cannot create RUNPATH/RPATH copy"); goto signal_error; } + /* Ignore empty rpaths. */ + if (*copy == 0) + { + free (copy); + sps->dirs = (char *) -1; + return false; + } + /* Count the number of necessary elements in the result array. */ nelems = 0; for (cp = copy; *cp != '\0'; ++cp) @@ -2175,7 +2187,7 @@ _dl_map_object (struct link_map *loader, const char *name, { /* The path may contain dynamic string tokens. */ realname = (loader - ? expand_dynamic_string_token (loader, name) + ? expand_dynamic_string_token (loader, name, 0) : local_strdup (name)); if (realname == NULL) fd = -1; |