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
This commit is contained in:
Konstantin Belousov 2012-05-05 11:26:08 +00:00
parent 54d642ad7d
commit eb6910ccca
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235054

View File

@ -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) {