diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-07-20 15:58:35 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-12-28 08:40:38 -0300 |
commit | cda4f265c65fb6c4ce38ca1cf0a7e527c5e77cd5 (patch) | |
tree | 08cea314723ae19c899357bc098baf9de570fc53 /elf/dl-sym-post.h | |
parent | 311c9ee54ea963ff69bd3a2e6981c37e893b4c3e (diff) | |
download | glibc-cda4f265c65fb6c4ce38ca1cf0a7e527c5e77cd5.tar.gz glibc-cda4f265c65fb6c4ce38ca1cf0a7e527c5e77cd5.tar.xz glibc-cda4f265c65fb6c4ce38ca1cf0a7e527c5e77cd5.zip |
elf: Add _dl_audit_symbind_alt and _dl_audit_symbind
It consolidates the code required to call la_symbind{32,64} audit callback. Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu. Reviewed-by: Florian Weimer <fweimer@redhat.com>
Diffstat (limited to 'elf/dl-sym-post.h')
-rw-r--r-- | elf/dl-sym-post.h | 47 |
1 files changed, 1 insertions, 46 deletions
diff --git a/elf/dl-sym-post.h b/elf/dl-sym-post.h index d68c2d2b1c..a11095d3e8 100644 --- a/elf/dl-sym-post.h +++ b/elf/dl-sym-post.h @@ -52,54 +52,9 @@ _dl_sym_post (lookup_t result, const ElfW(Sym) *ref, void *value, tell us whether further auditing is wanted. */ if (__glibc_unlikely (GLRO(dl_naudit) > 0)) { - const char *strtab = (const char *) D_PTR (result, - l_info[DT_STRTAB]); - /* Compute index of the symbol entry in the symbol table of - the DSO with the definition. */ - unsigned int ndx = (ref - (ElfW(Sym) *) D_PTR (result, - l_info[DT_SYMTAB])); - if (match == NULL) match = _dl_sym_find_caller_link_map (caller); - - if ((match->l_audit_any_plt | result->l_audit_any_plt) != 0) - { - unsigned int altvalue = 0; - struct audit_ifaces *afct = GLRO(dl_audit); - /* Synthesize a symbol record where the st_value field is - the result. */ - ElfW(Sym) sym = *ref; - sym.st_value = (ElfW(Addr)) value; - - for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) - { - struct auditstate *match_audit - = link_map_audit_state (match, cnt); - struct auditstate *result_audit - = link_map_audit_state (result, cnt); - if (afct->symbind != NULL - && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0 - || ((result_audit->bindflags & LA_FLG_BINDTO) - != 0))) - { - unsigned int flags = altvalue | LA_SYMB_DLSYM; - uintptr_t new_value - = afct->symbind (&sym, ndx, - &match_audit->cookie, - &result_audit->cookie, - &flags, strtab + ref->st_name); - if (new_value != (uintptr_t) sym.st_value) - { - altvalue = LA_SYMB_ALTVALUE; - sym.st_value = new_value; - } - } - - afct = afct->next; - } - - value = (void *) sym.st_value; - } + _dl_audit_symbind_alt (match, ref, &value, result); } #endif return value; |