[PATCH v3 2/4] elf: Signal la_objopen for the proxy link map in dlmopen (bug 31985)
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Tue Oct 8 14:35:43 GMT 2024
Looks good, although maybe extend the commit message a bit to explain that
this adds a new la_objopen event for ld.so in a new namespace.
On 04/09/24 15:50, Florian Weimer wrote:
> ---
> elf/dl-load.c | 61 ++++++++++++++++++++++++++---------------------
> elf/tst-audit23.c | 15 ++++++++++--
> 2 files changed, 47 insertions(+), 29 deletions(-)
>
> diff --git a/elf/dl-load.c b/elf/dl-load.c
> index 8a89b71016..54c9c4d779 100644
> --- a/elf/dl-load.c
> +++ b/elf/dl-load.c
> @@ -918,6 +918,37 @@ _dl_process_pt_gnu_property (struct link_map *l, int fd, const ElfW(Phdr) *ph)
> }
> }
>
> +static void
> +_dl_notify_new_object (int mode, Lmid_t nsid, struct link_map *l)
> +{
> + /* Signal that we are going to add new objects. */
> + struct r_debug *r = _dl_debug_update (nsid);
> + if (r->r_state == RT_CONSISTENT)
> + {
> +#ifdef SHARED
> + /* Auditing checkpoint: we are going to add new objects. Since this
> + is called after _dl_add_to_namespace_list the namespace is guaranteed
> + to not be empty. */
> + if ((mode & __RTLD_AUDIT) == 0)
> + _dl_audit_activity_nsid (nsid, LA_ACT_ADD);
> +#endif
> +
> + /* Notify the debugger we have added some objects. We need to
> + call _dl_debug_initialize in a static program in case dynamic
> + linking has not been used before. */
> + r->r_state = RT_ADD;
> + _dl_debug_state ();
> + LIBC_PROBE (map_start, 2, nsid, r);
> + }
> + else
> + assert (r->r_state == RT_ADD);
> +
> +#ifdef SHARED
> + /* Auditing checkpoint: we have a new object. */
> + if (!GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
> + _dl_audit_objopen (l, nsid);
> +#endif
> +}
>
> /* Map in the shared object NAME, actually located in REALNAME, and already
> opened on FD. */
> @@ -1018,6 +1049,8 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
> /* Add the map for the mirrored object to the object list. */
> _dl_add_to_namespace_list (l, nsid);
>
> + _dl_notify_new_object (mode, nsid, l);
> +
> return l;
> }
> #endif
> @@ -1442,33 +1475,7 @@ cannot enable executable stack as shared object requires");
> if (mode & __RTLD_SPROF)
> return l;
>
> - /* Signal that we are going to add new objects. */
> - struct r_debug *r = _dl_debug_update (nsid);
> - if (r->r_state == RT_CONSISTENT)
> - {
> -#ifdef SHARED
> - /* Auditing checkpoint: we are going to add new objects. Since this
> - is called after _dl_add_to_namespace_list the namespace is guaranteed
> - to not be empty. */
> - if ((mode & __RTLD_AUDIT) == 0)
> - _dl_audit_activity_nsid (nsid, LA_ACT_ADD);
> -#endif
> -
> - /* Notify the debugger we have added some objects. We need to
> - call _dl_debug_initialize in a static program in case dynamic
> - linking has not been used before. */
> - r->r_state = RT_ADD;
> - _dl_debug_state ();
> - LIBC_PROBE (map_start, 2, nsid, r);
> - }
> - else
> - assert (r->r_state == RT_ADD);
> -
> -#ifdef SHARED
> - /* Auditing checkpoint: we have a new object. */
> - if (!GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
> - _dl_audit_objopen (l, nsid);
> -#endif
> + _dl_notify_new_object (mode, nsid, l);
>
> return l;
> }
Ok.
> diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
> index 895dab08ea..462548d5ab 100644
> --- a/elf/tst-audit23.c
> +++ b/elf/tst-audit23.c
> @@ -52,6 +52,14 @@ startswith (const char *str, const char *pre)
> return lenstr >= lenpre && memcmp (pre, str, lenpre) == 0;
> }
>
> +static inline bool
> +endswith (const char *str, const char *suf)
> +{
> + size_t lensuf = strlen (suf);
> + size_t lenstr = strlen (str);
> + return lenstr >= lensuf && memcmp (suf, str + lenstr - lensuf, lensuf) == 0;
> +}
> +
Maybe include 'endswith.h' to avoid duplicate this function?
> static inline bool
> is_vdso (const char *str)
> {
> @@ -106,8 +114,9 @@ do_test (int argc, char *argv[])
> 4. libgcc_s.so (one some architectures, for libsupport)
> 5. tst-audit23mod.so
> 6. libc.so (LM_ID_NEWLM).
> + 7. loader (proxy link map in new namespace)
> vdso (optional and ignored). */
> - enum { max_objs = 6 };
> + enum { max_objs = 7 };
> struct la_obj_t
> {
> char *lname;
> @@ -236,7 +245,9 @@ do_test (int argc, char *argv[])
>
> for (size_t i = 0; i < nobjs; i++)
> {
> - TEST_COMPARE (objs[i].closed, true);
> + /* This subtest currently does not pass because of bug 32065. */
> + if (! (endswith (objs[i].lname, LD_SO) && objs[i].lmid != LM_ID_BASE))
> + TEST_COMPARE (objs[i].closed, true);
> free (objs[i].lname);
> }
>
Ok.
More information about the Libc-alpha
mailing list