public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [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).