stdlib: resolve a double lock init issue after fork [BZ #32994]
Florian Weimer
fweimer@redhat.com
Thu Jul 31 16:46:04 GMT 2025
* Davide Cavalca:
> From 6021819e5b528f93fb325ddd9d59f69a39b0a162 Mon Sep 17 00:00:00 2001
> From: Davide Cavalca <davide@cavalca.name>
> Date: Sat, 14 Jun 2025 11:31:17 +0200
> Subject: [PATCH] stdlib: resolve a double lock init issue after fork [BZ
> #32994]
>
> The __abort_fork_reset_child (introduced in
> d40ac01cbbc66e6d9dbd8e3485605c63b2178251) call resets the lock after the
> fork. This causes a DRD regression in valgrind
> (https://bugs.kde.org/show_bug.cgi?id=503668), as it's effectively a
> double initialization, despite it being actually ok in this case. As
> suggested in https://sourceware.org/bugzilla/show_bug.cgi?id=32994#c2
> we replace it here with a memcpy of another initialized lock instead,
> which makes valgrind happy.
>
> v2: move the lock definition into __abort_fork_reset_child
> v3: style fixes
> v4: more style fixes, add missing include for Hurd
>
> Signed-off-by: Davide Cavalca <davide@cavalca.name>
> ---
> stdlib/abort.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/stdlib/abort.c b/stdlib/abort.c
> index caa9e6dc04..1dabaa3ba6 100644
> --- a/stdlib/abort.c
> +++ b/stdlib/abort.c
> @@ -19,6 +19,7 @@
> #include <internal-signals.h>
> #include <libc-lock.h>
> #include <pthreadP.h>
> +#include <string.h>
> #include <unistd.h>
>
> /* Try to get a machine dependent instruction which will make the
> @@ -42,7 +43,9 @@ __libc_rwlock_define_initialized (static, lock);
> void
> __abort_fork_reset_child (void)
> {
> - __libc_rwlock_init (lock);
> + /* The reset_lock is copied into lock after the fork */
> + __libc_rwlock_define_initialized (, reset_lock);
> + memcpy (&lock, &reset_lock, sizeof (lock));
> }
Is it okay if I turn the comment into:
/* Reinitialize lock without calling pthread_rwlock_init, to
avoid a valgrind DRD false positive. */
?
Thanks,
Florian
More information about the Libc-alpha
mailing list