rtld symlook_obj: move common code to check filtees into helper

Revieved by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D43858
This commit is contained in:
Konstantin Belousov 2024-02-13 02:48:42 +02:00
parent 69e4b35eb3
commit 9ea864b54b

View file

@ -4690,6 +4690,20 @@ symlook_needed(SymLook *req, const Needed_Entry *needed, DoneList *dlp)
return (ESRCH);
}
static int
symlook_obj_load_filtees(SymLook *req, SymLook *req1, const Obj_Entry *obj,
Needed_Entry *needed)
{
DoneList donelist;
int flags;
flags = (req->flags & SYMLOOK_EARLY) != 0 ? RTLD_LO_EARLY : 0;
load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate);
donelist_init(&donelist);
symlook_init_from_req(req1, req);
return (symlook_needed(req1, needed, &donelist));
}
/*
* Search the symbol table of a single shared object for a symbol of
* the given name and version, if requested. Returns a pointer to the
@ -4702,9 +4716,8 @@ symlook_needed(SymLook *req, const Needed_Entry *needed, DoneList *dlp)
int
symlook_obj(SymLook *req, const Obj_Entry *obj)
{
DoneList donelist;
SymLook req1;
int flags, res, mres;
int res, mres;
/*
* If there is at least one valid hash at this point, we prefer to
@ -4719,11 +4732,8 @@ symlook_obj(SymLook *req, const Obj_Entry *obj)
if (mres == 0) {
if (obj->needed_filtees != NULL) {
flags = (req->flags & SYMLOOK_EARLY) ? RTLD_LO_EARLY : 0;
load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate);
donelist_init(&donelist);
symlook_init_from_req(&req1, req);
res = symlook_needed(&req1, obj->needed_filtees, &donelist);
res = symlook_obj_load_filtees(req, &req1, obj,
obj->needed_filtees);
if (res == 0) {
req->sym_out = req1.sym_out;
req->defobj_out = req1.defobj_out;
@ -4731,11 +4741,8 @@ symlook_obj(SymLook *req, const Obj_Entry *obj)
return (res);
}
if (obj->needed_aux_filtees != NULL) {
flags = (req->flags & SYMLOOK_EARLY) ? RTLD_LO_EARLY : 0;
load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate);
donelist_init(&donelist);
symlook_init_from_req(&req1, req);
res = symlook_needed(&req1, obj->needed_aux_filtees, &donelist);
res = symlook_obj_load_filtees(req, &req1, obj,
obj->needed_aux_filtees);
if (res == 0) {
req->sym_out = req1.sym_out;
req->defobj_out = req1.defobj_out;