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:
parent
54d642ad7d
commit
eb6910ccca
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235054
@ -3480,13 +3480,15 @@ symlook_obj(SymLook *req, const Obj_Entry *obj)
|
|||||||
int flags, res, mres;
|
int flags, res, mres;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There is at least one valid hash at this point, and we prefer to use
|
* If there is at least one valid hash at this point, we prefer to
|
||||||
* the faster GNU version if available.
|
* use the faster GNU version if available.
|
||||||
*/
|
*/
|
||||||
if (obj->valid_hash_gnu)
|
if (obj->valid_hash_gnu)
|
||||||
mres = symlook_obj1_gnu(req, obj);
|
mres = symlook_obj1_gnu(req, obj);
|
||||||
else
|
else if (obj->valid_hash_sysv)
|
||||||
mres = symlook_obj1_sysv(req, obj);
|
mres = symlook_obj1_sysv(req, obj);
|
||||||
|
else
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (mres == 0) {
|
if (mres == 0) {
|
||||||
if (obj->needed_filtees != NULL) {
|
if (obj->needed_filtees != NULL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user