1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Introduce link_map_audit_state accessor function

To improve GCC 10 compatibility, it is necessary to remove the l_audit
zero-length array from the end of struct link_map.  In preparation of
that, this commit introduces an accessor function for the audit state,
so that it is possible to change the representation of the audit state
without adjusting the code that accesses it.

Tested on x86_64-linux-gnu.  Built on i686-gnu.

Change-Id: Id815673c29950fc011ae5301d7cde12624f658df
This commit is contained in:
Florian Weimer
2019-11-02 20:04:02 +01:00
parent c7bf5ceab6
commit e1d559f337
10 changed files with 78 additions and 45 deletions

View File

@ -272,7 +272,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->preinit != NULL) if (afct->preinit != NULL)
afct->preinit (&head->l_audit[cnt].cookie); afct->preinit (&link_map_audit_state (head, cnt)->cookie);
afct = afct->next; afct = afct->next;
} }

View File

@ -302,8 +302,12 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->objclose != NULL) if (afct->objclose != NULL)
/* Return value is ignored. */ {
(void) afct->objclose (&imap->l_audit[cnt].cookie); struct auditstate *state
= link_map_audit_state (imap, cnt);
/* Return value is ignored. */
(void) afct->objclose (&state->cookie);
}
afct = afct->next; afct = afct->next;
} }
@ -478,7 +482,10 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&head->l_audit[cnt].cookie, LA_ACT_DELETE); {
struct auditstate *state = link_map_audit_state (head, cnt);
afct->activity (&state->cookie, LA_ACT_DELETE);
}
afct = afct->next; afct = afct->next;
} }
@ -774,7 +781,10 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); {
struct auditstate *state = link_map_audit_state (head, cnt);
afct->activity (&state->cookie, LA_ACT_CONSISTENT);
}
afct = afct->next; afct = afct->next;
} }

View File

@ -152,9 +152,12 @@ _dl_fini (void)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->objclose != NULL) if (afct->objclose != NULL)
/* Return value is ignored. */ {
(void) afct->objclose (&l->l_audit[cnt].cookie); struct auditstate *state
= link_map_audit_state (l, cnt);
/* Return value is ignored. */
(void) afct->objclose (&state->cookie);
}
afct = afct->next; afct = afct->next;
} }
} }

View File

@ -973,7 +973,8 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&head->l_audit[cnt].cookie, LA_ACT_ADD); afct->activity (&link_map_audit_state (head, cnt)->cookie,
LA_ACT_ADD);
afct = afct->next; afct = afct->next;
} }
@ -1402,10 +1403,9 @@ cannot enable executable stack as shared object requires");
{ {
if (afct->objopen != NULL) if (afct->objopen != NULL)
{ {
l->l_audit[cnt].bindflags struct auditstate *state = link_map_audit_state (l, cnt);
= afct->objopen (l, nsid, &l->l_audit[cnt].cookie); state->bindflags = afct->objopen (l, nsid, &state->cookie);
l->l_audit_any_plt |= state->bindflags != 0;
l->l_audit_any_plt |= l->l_audit[cnt].bindflags != 0;
} }
afct = afct->next; afct = afct->next;
@ -1511,8 +1511,8 @@ open_verify (const char *name, int fd,
{ {
if (afct->objsearch != NULL) if (afct->objsearch != NULL)
{ {
name = afct->objsearch (name, &loader->l_audit[cnt].cookie, struct auditstate *state = link_map_audit_state (loader, cnt);
whatcode); name = afct->objsearch (name, &state->cookie, whatcode);
if (name == NULL) if (name == NULL)
/* Ignore the path. */ /* Ignore the path. */
return -1; return -1;
@ -1970,8 +1970,8 @@ _dl_map_object (struct link_map *loader, const char *name,
if (afct->objsearch != NULL) if (afct->objsearch != NULL)
{ {
const char *before = name; const char *before = name;
name = afct->objsearch (name, &loader->l_audit[cnt].cookie, struct auditstate *state = link_map_audit_state (loader, cnt);
LA_SER_ORIG); name = afct->objsearch (name, &state->cookie, LA_SER_ORIG);
if (name == NULL) if (name == NULL)
{ {
/* Do not try anything further. */ /* Do not try anything further. */

View File

@ -81,7 +81,7 @@ _dl_new_object (char *realname, const char *libname, int type,
struct link_map *new; struct link_map *new;
struct libname_list *newname; struct libname_list *newname;
#ifdef SHARED #ifdef SHARED
size_t audit_space = naudit * sizeof (new->l_audit[0]); size_t audit_space = naudit * sizeof (struct auditstate);
#else #else
# define audit_space 0 # define audit_space 0
#endif #endif
@ -134,10 +134,8 @@ _dl_new_object (char *realname, const char *libname, int type,
#ifdef SHARED #ifdef SHARED
for (unsigned int cnt = 0; cnt < naudit; ++cnt) for (unsigned int cnt = 0; cnt < naudit; ++cnt)
{ /* No need to initialize bindflags due to calloc. */
new->l_audit[cnt].cookie = (uintptr_t) new; link_map_audit_state (new, cnt)->cookie = (uintptr_t) new;
/* new->l_audit[cnt].bindflags = 0; */
}
#endif #endif
/* new->l_global = 0; We use calloc therefore not necessary. */ /* new->l_global = 0; We use calloc therefore not necessary. */

View File

@ -278,7 +278,10 @@ dl_open_worker (void *a)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); {
struct auditstate *state = link_map_audit_state (head, cnt);
afct->activity (&state->cookie, LA_ACT_CONSISTENT);
}
afct = afct->next; afct = afct->next;
} }

View File

@ -325,15 +325,18 @@ _dl_profile_fixup (
{ {
/* XXX Check whether both DSOs must request action or /* XXX Check whether both DSOs must request action or
only one */ only one */
if ((l->l_audit[cnt].bindflags & LA_FLG_BINDFROM) != 0 struct auditstate *l_state = link_map_audit_state (l, cnt);
&& (result->l_audit[cnt].bindflags & LA_FLG_BINDTO) != 0) struct auditstate *result_state
= link_map_audit_state (result, cnt);
if ((l_state->bindflags & LA_FLG_BINDFROM) != 0
&& (result_state->bindflags & LA_FLG_BINDTO) != 0)
{ {
if (afct->symbind != NULL) if (afct->symbind != NULL)
{ {
uintptr_t new_value uintptr_t new_value
= afct->symbind (&sym, reloc_result->boundndx, = afct->symbind (&sym, reloc_result->boundndx,
&l->l_audit[cnt].cookie, &l_state->cookie,
&result->l_audit[cnt].cookie, &result_state->cookie,
&flags, &flags,
strtab2 + defsym->st_name); strtab2 + defsym->st_name);
if (new_value != (uintptr_t) sym.st_value) if (new_value != (uintptr_t) sym.st_value)
@ -421,10 +424,13 @@ _dl_profile_fixup (
& (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0) & (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
{ {
long int new_framesize = -1; long int new_framesize = -1;
struct auditstate *l_state = link_map_audit_state (l, cnt);
struct auditstate *bound_state
= link_map_audit_state (reloc_result->bound, cnt);
uintptr_t new_value uintptr_t new_value
= afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx, = afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
&l->l_audit[cnt].cookie, &l_state->cookie,
&reloc_result->bound->l_audit[cnt].cookie, &bound_state->cookie,
regs, &flags, symname, regs, &flags, symname,
&new_framesize); &new_framesize);
if (new_value != (uintptr_t) sym.st_value) if (new_value != (uintptr_t) sym.st_value)
@ -504,9 +510,11 @@ _dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
&& (reloc_result->enterexit && (reloc_result->enterexit
& (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0) & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
{ {
struct auditstate *l_state = link_map_audit_state (l, cnt);
struct auditstate *bound_state
= link_map_audit_state (reloc_result->bound, cnt);
afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx, afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
&l->l_audit[cnt].cookie, &l_state->cookie, &bound_state->cookie,
&reloc_result->bound->l_audit[cnt].cookie,
inregs, outregs, symname); inregs, outregs, symname);
} }

View File

@ -198,17 +198,20 @@ RTLD_NEXT used in code not dynamically loaded"));
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) 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 if (afct->symbind != NULL
&& ((match->l_audit[cnt].bindflags & LA_FLG_BINDFROM) && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0
!= 0 || ((result_audit->bindflags & LA_FLG_BINDTO)
|| ((result->l_audit[cnt].bindflags & LA_FLG_BINDTO)
!= 0))) != 0)))
{ {
unsigned int flags = altvalue | LA_SYMB_DLSYM; unsigned int flags = altvalue | LA_SYMB_DLSYM;
uintptr_t new_value uintptr_t new_value
= afct->symbind (&sym, ndx, = afct->symbind (&sym, ndx,
&match->l_audit[cnt].cookie, &match_audit->cookie,
&result->l_audit[cnt].cookie, &result_audit->cookie,
&flags, strtab + ref->st_name); &flags, strtab + ref->st_name);
if (new_value != (uintptr_t) sym.st_value) if (new_value != (uintptr_t) sym.st_value)
{ {

View File

@ -1025,9 +1025,9 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
else else
*last_audit = (*last_audit)->next = &newp->ifaces; *last_audit = (*last_audit)->next = &newp->ifaces;
/* The dynamic linker link map is statically allocated, initialize /* The dynamic linker link map is statically allocated, so the
the data now. */ cookie in _dl_new_object has not happened. */
GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie link_map_audit_state (&GL (dl_rtld_map), GLRO (dl_naudit))->cookie
= (intptr_t) &GL (dl_rtld_map); = (intptr_t) &GL (dl_rtld_map);
++GLRO(dl_naudit); ++GLRO(dl_naudit);
@ -1046,9 +1046,9 @@ notify_audit_modules_of_loaded_object (struct link_map *map)
{ {
if (afct->objopen != NULL) if (afct->objopen != NULL)
{ {
map->l_audit[cnt].bindflags struct auditstate *state = link_map_audit_state (map, cnt);
= afct->objopen (map, LM_ID_BASE, &map->l_audit[cnt].cookie); state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie);
map->l_audit_any_plt |= map->l_audit[cnt].bindflags != 0; map->l_audit_any_plt |= state->bindflags != 0;
} }
afct = afct->next; afct = afct->next;
@ -1662,7 +1662,8 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&main_map->l_audit[cnt].cookie, LA_ACT_ADD); afct->activity (&link_map_audit_state (main_map, cnt)->cookie,
LA_ACT_ADD);
afct = afct->next; afct = afct->next;
} }
@ -2333,7 +2334,8 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{ {
if (afct->activity != NULL) if (afct->activity != NULL)
afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); afct->activity (&link_map_audit_state (head, cnt)->cookie,
LA_ACT_CONSISTENT);
afct = afct->next; afct = afct->next;
} }

View File

@ -1174,7 +1174,13 @@ rtld_active (void)
initialized and active ld.so copy. */ initialized and active ld.so copy. */
return GLRO(dl_init_all_dirs) != NULL; return GLRO(dl_init_all_dirs) != NULL;
} }
#endif
static inline struct auditstate *
link_map_audit_state (struct link_map *l, size_t index)
{
return &l->l_audit[index];
}
#endif /* SHARED */
__END_DECLS __END_DECLS