new/buildroot/package/glibc/2.28-69-g1e5c5303a522764d7e9d2302a60e4a32cdb902f1/0013-Introduce-link_map_audit_state-accessor-function.patch
2025-05-10 21:58:58 +08:00

357 lines
12 KiB
Diff

From f162d34588669953e6618f329c80a004903aab80 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Sat, 2 Nov 2019 20:04:02 +0100
Subject: [PATCH 13/20] 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
(cherry picked from commit e1d559f337de2c8ab68a6749dfe873477c883807)
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
csu/libc-start.c | 2 +-
elf/dl-close.c | 18 ++++++++++++++----
elf/dl-fini.c | 9 ++++++---
elf/dl-load.c | 18 +++++++++---------
elf/dl-object.c | 8 +++-----
elf/dl-open.c | 5 ++++-
elf/dl-runtime.c | 24 ++++++++++++++++--------
elf/dl-sym.c | 13 ++++++++-----
elf/rtld.c | 18 ++++++++++--------
sysdeps/generic/ldsodefs.h | 8 +++++++-
10 files changed, 78 insertions(+), 45 deletions(-)
diff --git a/csu/libc-start.c b/csu/libc-start.c
index dd572d53..2b72ae7f 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -273,7 +273,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->preinit != NULL)
- afct->preinit (&head->l_audit[cnt].cookie);
+ afct->preinit (&link_map_audit_state (head, cnt)->cookie);
afct = afct->next;
}
diff --git a/elf/dl-close.c b/elf/dl-close.c
index ecd67297..40333a23 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -302,8 +302,12 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
@@ -478,7 +482,10 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
@@ -774,7 +781,10 @@ _dl_close_worker (struct link_map *map, bool force)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
index 3cfc2624..915ceb10 100644
--- a/elf/dl-fini.c
+++ b/elf/dl-fini.c
@@ -152,9 +152,12 @@ _dl_fini (void)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
}
diff --git a/elf/dl-load.c b/elf/dl-load.c
index c51e4b37..bfe9f5ba 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -978,7 +978,8 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
@@ -1391,10 +1392,9 @@ cannot enable executable stack as shared object requires");
{
if (afct->objopen != NULL)
{
- l->l_audit[cnt].bindflags
- = afct->objopen (l, nsid, &l->l_audit[cnt].cookie);
-
- l->l_audit_any_plt |= l->l_audit[cnt].bindflags != 0;
+ struct auditstate *state = link_map_audit_state (l, cnt);
+ state->bindflags = afct->objopen (l, nsid, &state->cookie);
+ l->l_audit_any_plt |= state->bindflags != 0;
}
afct = afct->next;
@@ -1500,8 +1500,8 @@ open_verify (const char *name, int fd,
{
if (afct->objsearch != NULL)
{
- name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
- whatcode);
+ struct auditstate *state = link_map_audit_state (loader, cnt);
+ name = afct->objsearch (name, &state->cookie, whatcode);
if (name == NULL)
/* Ignore the path. */
return -1;
@@ -1982,8 +1982,8 @@ _dl_map_object (struct link_map *loader, const char *name,
if (afct->objsearch != NULL)
{
const char *before = name;
- name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
- LA_SER_ORIG);
+ struct auditstate *state = link_map_audit_state (loader, cnt);
+ name = afct->objsearch (name, &state->cookie, LA_SER_ORIG);
if (name == NULL)
{
/* Do not try anything further. */
diff --git a/elf/dl-object.c b/elf/dl-object.c
index b37bcc12..b75bb2cd 100644
--- a/elf/dl-object.c
+++ b/elf/dl-object.c
@@ -65,7 +65,7 @@ _dl_new_object (char *realname, const char *libname, int type,
auditing libraries and if yes, how many. Assume the worst. */
unsigned int naudit = GLRO(dl_naudit) ?: ((mode & __RTLD_OPENEXEC)
? DL_NNS : 0);
- size_t audit_space = naudit * sizeof (new->l_audit[0]);
+ size_t audit_space = naudit * sizeof (struct auditstate);
#else
# define audit_space 0
#endif
@@ -106,10 +106,8 @@ _dl_new_object (char *realname, const char *libname, int type,
#ifdef SHARED
for (unsigned int cnt = 0; cnt < naudit; ++cnt)
- {
- new->l_audit[cnt].cookie = (uintptr_t) new;
- /* new->l_audit[cnt].bindflags = 0; */
- }
+ /* No need to initialize bindflags due to calloc. */
+ link_map_audit_state (new, cnt)->cookie = (uintptr_t) new;
#endif
/* new->l_global = 0; We use calloc therefore not necessary. */
diff --git a/elf/dl-open.c b/elf/dl-open.c
index f6c8ef10..44f8ed40 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -278,7 +278,10 @@ dl_open_worker (void *a)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index 3d2f4a7a..72b03e00 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -325,15 +325,18 @@ _dl_profile_fixup (
{
/* XXX Check whether both DSOs must request action or
only one */
- if ((l->l_audit[cnt].bindflags & LA_FLG_BINDFROM) != 0
- && (result->l_audit[cnt].bindflags & LA_FLG_BINDTO) != 0)
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
+ 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)
{
uintptr_t new_value
= afct->symbind (&sym, reloc_result->boundndx,
- &l->l_audit[cnt].cookie,
- &result->l_audit[cnt].cookie,
+ &l_state->cookie,
+ &result_state->cookie,
&flags,
strtab2 + defsym->st_name);
if (new_value != (uintptr_t) sym.st_value)
@@ -421,10 +424,13 @@ _dl_profile_fixup (
& (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
{
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
= afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
- &l->l_audit[cnt].cookie,
- &reloc_result->bound->l_audit[cnt].cookie,
+ &l_state->cookie,
+ &bound_state->cookie,
regs, &flags, symname,
&new_framesize);
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
& (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,
- &l->l_audit[cnt].cookie,
- &reloc_result->bound->l_audit[cnt].cookie,
+ &l_state->cookie, &bound_state->cookie,
inregs, outregs, symname);
}
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index 189628ad..286cf7e2 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -198,17 +198,20 @@ RTLD_NEXT used in code not dynamically loaded"));
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->l_audit[cnt].bindflags & LA_FLG_BINDFROM)
- != 0
- || ((result->l_audit[cnt].bindflags & LA_FLG_BINDTO)
+ && ((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->l_audit[cnt].cookie,
- &result->l_audit[cnt].cookie,
+ &match_audit->cookie,
+ &result_audit->cookie,
&flags, strtab + ref->st_name);
if (new_value != (uintptr_t) sym.st_value)
{
diff --git a/elf/rtld.c b/elf/rtld.c
index 63525ad5..d3b1541d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1007,9 +1007,9 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
else
*last_audit = (*last_audit)->next = &newp->ifaces;
- /* The dynamic linker link map is statically allocated, initialize
- the data now. */
- GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie
+ /* The dynamic linker link map is statically allocated, so the
+ cookie in _dl_new_object has not happened. */
+ link_map_audit_state (&GL (dl_rtld_map), GLRO (dl_naudit))->cookie
= (intptr_t) &GL (dl_rtld_map);
++GLRO(dl_naudit);
@@ -1028,9 +1028,9 @@ notify_audit_modules_of_loaded_object (struct link_map *map)
{
if (afct->objopen != NULL)
{
- map->l_audit[cnt].bindflags
- = afct->objopen (map, LM_ID_BASE, &map->l_audit[cnt].cookie);
- map->l_audit_any_plt |= map->l_audit[cnt].bindflags != 0;
+ struct auditstate *state = link_map_audit_state (map, cnt);
+ state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie);
+ map->l_audit_any_plt |= state->bindflags != 0;
}
afct = afct->next;
@@ -1642,7 +1642,8 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
@@ -2318,7 +2319,8 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
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;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index ef7d0e28..910a31e3 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -1166,7 +1166,13 @@ rtld_active (void)
initialized and active ld.so copy. */
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
--
2.20.1