[1/3] elf: Signal la_objopen for the proxy link map in dlmopen (bug 31985)
Checks
Context |
Check |
Description |
redhat-pt-bot/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
linaro-tcwg-bot/tcwg_glibc_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_glibc_check--master-arm |
fail
|
Test failed
|
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 |
success
|
Test passed
|
Commit Message
---
elf/dl-load.c | 61 ++++++++++++++++++++++++++---------------------
elf/tst-audit23.c | 12 +++++++++-
2 files changed, 45 insertions(+), 28 deletions(-)
Comments
It has failed on armhf [1] with:
FAIL: elf/tst-audit23
original exit status 1
error: tst-audit23.c:185: non expected la_objopen: /home/tcwg-build/workspace/tcwg_gnu_0/abe/builds/armv8l-unknown-linux-gnueabihf/armv8l-unknown-linux-gnueabihf/glibc-glibc.git~master/elf/ld-linux-armhf.so.3 f7e18000 2
error: 1 test failures
[1] https://ci.linaro.org/job/tcwg_glibc_check--master-arm-precommit/2325/artifact/artifacts/artifacts.precommit/00-sumfiles/
On 09/08/24 18:44, Florian Weimer wrote:
> ---
> elf/dl-load.c | 61 ++++++++++++++++++++++++++---------------------
> elf/tst-audit23.c | 12 +++++++++-
> 2 files changed, 45 insertions(+), 28 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;
> }
> diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
> index d2640fe8b2..8b3a09a7e1 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;
> +}
> +
> static inline bool
> is_vdso (const char *str)
> {
> @@ -219,7 +227,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);
> }
>
@@ -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;
}
@@ -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;
+}
+
static inline bool
is_vdso (const char *str)
{
@@ -219,7 +227,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);
}