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>