[PATCH] Don't leave empty element in rpath when skipping an element
Andreas Schwab
schwab@redhat.com
Wed Mar 30 11:44:00 GMT 2011
2011-03-10 Andreas Schwab <schwab@redhat.com>
* elf/dl-load.c (_dl_dst_substitute): When skipping a path element
also skip the 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.
---
elf/dl-load.c | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index f866066..0dc3d6e 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -282,8 +282,9 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result,
replacement is unknown. */
wp = last_elem;
name += len;
- while (*name != '\0' && (!is_path || *name != ':'))
- ++name;
+ while (*name != '\0')
+ if (*name++ == ':' && is_path)
+ break;
}
else
/* No DST we recognize. */
@@ -310,7 +311,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 +322,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 +336,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 +552,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)
@@ -2179,7 +2188,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;
--
1.7.4
--
Andreas Schwab, schwab@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E
"And now for something completely different."
More information about the Libc-hacker
mailing list