* [PATCH] Don't leave empty element in rpath when skipping an element
@ 2011-03-14 10:38 Andreas Schwab
2011-03-30 11:44 ` Andreas Schwab
0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2011-03-14 10:38 UTC (permalink / raw)
To: libc-hacker
2011-03-09 Andreas Schwab <schwab@redhat.com>
* elf/dl-load.c (_dl_dst_substitute): When skipping a path element
also skip the colon.
---
elf/dl-load.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index b19f72a..a474a0c 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -284,6 +284,8 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result,
name += len;
while (*name != '\0' && (!is_path || *name != ':'))
++name;
+ if (is_path && *name == ':')
+ ++name;
}
else
/* No DST we recognize. */
--
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."
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] Don't leave empty element in rpath when skipping an element
2011-03-14 10:38 [PATCH] Don't leave empty element in rpath when skipping an element Andreas Schwab
@ 2011-03-30 11:44 ` Andreas Schwab
2011-03-30 13:31 ` Andreas Schwab
0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2011-03-30 11:44 UTC (permalink / raw)
To: libc-hacker
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."
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] Don't leave empty element in rpath when skipping an element
2011-03-30 11:44 ` Andreas Schwab
@ 2011-03-30 13:31 ` Andreas Schwab
0 siblings, 0 replies; 3+ messages in thread
From: Andreas Schwab @ 2011-03-30 13:31 UTC (permalink / raw)
To: libc-hacker
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.
---
elf/dl-load.c | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 1974ef5..ed3552f 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
@@ -282,6 +282,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. */
@@ -308,7 +312,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
@@ -319,7 +323,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)
@@ -333,7 +337,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);
}
@@ -549,13 +553,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)
@@ -2177,7 +2189,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."
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-03-14 10:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-14 10:38 [PATCH] Don't leave empty element in rpath when skipping an element Andreas Schwab
2011-03-30 11:44 ` Andreas Schwab
2011-03-30 13:31 ` Andreas Schwab
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).