summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-05-05 11:26:08 +0000
committerkib <kib@FreeBSD.org>2012-05-05 11:26:08 +0000
commitef35586c59f5be2748c893fb97b41c9081919a67 (patch)
tree28d62cdd44d4243bbf4c70953adf15faa8d854ab /libexec
parentaf723a8e1a44b0db268646791cb0fd8f092aaa45 (diff)
downloadFreeBSD-src-ef35586c59f5be2748c893fb97b41c9081919a67.zip
FreeBSD-src-ef35586c59f5be2748c893fb97b41c9081919a67.tar.gz
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
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 9276a52..621d084 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -3480,13 +3480,15 @@ symlook_obj(SymLook *req, const Obj_Entry *obj)
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) {
OpenPOWER on IntegriCloud