]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Don't leave empty element in rpath when skipping an element
authorAndreas Schwab <schwab@linux-m68k.org>
Sat, 9 Apr 2011 18:55:26 +0000 (19:55 +0100)
committerPetr Baudis <pasky@suse.cz>
Thu, 26 May 2011 22:29:24 +0000 (00:29 +0200)
(cherry picked from commit 34fe483e121660aff222ec1c15d57804f64191ea)

ChangeLog
elf/dl-load.c

index e9e8f505e93fc454ce24adcba06e938d525992ba..2e7c309e3ff1e9360f4ca8b71df5cd68755fd1ad 100644 (file)
--- 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-04-07  Andreas Schwab  <schwab@redhat.com>
 
        * sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (CALL_FAIL):
index 8d4ad73b55814c536639c509bae86f5185852312..2993aa9706dcd398d84a55852b1ea432f8c95432 100644 (file)
@@ -1,5 +1,5 @@
 /* Map in a shared object's segments from the file.
-   Copyright (C) 1995-2005, 2006, 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1995-2005, 2006, 2007, 2009, 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 now
@@ -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)
@@ -2170,7 +2182,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;