rtld: Sync 3/7 - LD_PRELOAD and z_nodeflib fix
authorJohn Marino <draco@marino.st>
Wed, 12 Jun 2013 12:06:58 +0000 (14:06 +0200)
committerJohn Marino <draco@marino.st>
Thu, 13 Jun 2013 11:12:07 +0000 (13:12 +0200)
Do not reference z_nodeflib for !objgiven case in order to fix LD_PRELOAD
for a non-absolute path.

Taken from:
FreeBSD SVN 240686 (18 SEP 2012)

libexec/rtld-elf/rtld.c

index 0a83c3f..4763eba 100644 (file)
@@ -1521,8 +1521,9 @@ find_library(const char *xname, const Obj_Entry *refobj)
 {
     char *pathname;
     char *name;
-    bool objgiven = (refobj != NULL);
+    bool nodeflib, objgiven;
 
+    objgiven = refobj != NULL;
     if (strchr(xname, '/') != NULL) {  /* Hard coded pathname */
        if (xname[0] != '/' && !trust) {
            _rtld_error("Absolute pathname required for shared object \"%s\"",
@@ -1541,20 +1542,20 @@ find_library(const char *xname, const Obj_Entry *refobj)
 
     dbg(" Searching for \"%s\"", name);
 
+    nodeflib = objgiven ? refobj->z_nodeflib : false;
     if ((objgiven &&
       (pathname = search_library_path(name, refobj->rpath)) != NULL) ||
-      (objgiven && (refobj->runpath == NULL) && (refobj != obj_main) &&
+      (objgiven && refobj->runpath == NULL && refobj != obj_main &&
       (pathname = search_library_path(name, obj_main->rpath)) != NULL) ||
       (pathname = search_library_path(name, ld_library_path)) != NULL ||
       (objgiven &&
       (pathname = search_library_path(name, refobj->runpath)) != NULL) ||
-      (pathname = search_library_path(name, gethints(refobj->z_nodeflib)))
-       != NULL ||
-      (objgiven && !refobj->z_nodeflib &&
+         (pathname = search_library_path(name, gethints(nodeflib))) != NULL ||
+         (objgiven && !nodeflib &&
       (pathname = search_library_path(name, STANDARD_LIBRARY_PATH)) != NULL))
-       return pathname;
+       return (pathname);
 
-    if(objgiven && refobj->path != NULL) {
+    if (objgiven && refobj->path != NULL) {
        _rtld_error("Shared object \"%s\" not found, required by \"%s\"",
          name, basename(refobj->path));
     } else {
@@ -3791,7 +3792,7 @@ symlook_obj(SymLook *req, const Obj_Entry *obj)
     int flags, res, mres;
 
     /*
-     * If there is at least one valid hash at this point, and we prefer to
+     * If there is at least one valid hash at this point, we prefer to
      * use the faster GNU version if available.
      */
     if (obj->valid_hash_gnu)