Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 May 2012 11:26:09 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r235054 - head/libexec/rtld-elf
Message-ID:  <201205051126.q45BQ9B5056205@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sat May  5 11:26:08 2012
New Revision: 235054
URL: http://svn.freebsd.org/changeset/base/235054

Log:
  Work around a situation where symlook_obj() could be called for the
  object for which digest_dynamic1() was not done yet. Just return
  EINVAL and do not try to dereference NULL buckets hash array.
  
  This seems to happen on ia64 for rtld object itself, where the
  R_IA_64_FPTR64LSB relocations require symbol lookup. The dynamic
  linker itself does not rely on identity of the C-level function
  pointers (i.e. function descriptors).
  
  Reported and reviewed by:	marcel
  MFC after:   8 days

Modified:
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Sat May  5 10:05:13 2012	(r235053)
+++ head/libexec/rtld-elf/rtld.c	Sat May  5 11:26:08 2012	(r235054)
@@ -3480,13 +3480,15 @@ symlook_obj(SymLook *req, const Obj_Entr
     int flags, res, mres;
 
     /*
-     * There is at least one valid hash at this point, and we prefer to use
-     * the faster GNU version if available.
+     * 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)
 	mres = symlook_obj1_gnu(req, obj);
-    else
+    else if (obj->valid_hash_sysv)
 	mres = symlook_obj1_sysv(req, obj);
+    else
+	return (EINVAL);
 
     if (mres == 0) {
 	if (obj->needed_filtees != NULL) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205051126.q45BQ9B5056205>