From 4e648ea3ad623fa7e6f2afcdf2cb0aefefdda061 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 19 Apr 2003 18:26:10 +0000 Subject: Update. * stdlib/cxa_finalize.c (__cxa_finalize): Don't call UNREGISTER_ATFORK if d == NULL. --- nptl/sysdeps/unix/sysv/linux/unregister-atfork.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'nptl/sysdeps/unix') diff --git a/nptl/sysdeps/unix/sysv/linux/unregister-atfork.c b/nptl/sysdeps/unix/sysv/linux/unregister-atfork.c index 7b3a785923..e9eb1918f6 100644 --- a/nptl/sysdeps/unix/sysv/linux/unregister-atfork.c +++ b/nptl/sysdeps/unix/sysv/linux/unregister-atfork.c @@ -22,6 +22,14 @@ #include "fork.h" +/* Defined in libc_pthread_init.c. */ +extern struct fork_handler __pthread_child_handler attribute_hidden; +/* Three static memory blocks used when registering malloc. */ +static struct fork_handler malloc_prepare; +static struct fork_handler malloc_parent; +static struct fork_handler malloc_child; + + void __unregister_atfork (dso_handle) void *dso_handle; @@ -37,7 +45,9 @@ __unregister_atfork (dso_handle) { list_del (runp); - free (list_entry (runp, struct fork_handler, list)); + struct fork_handler *p = list_entry (runp, struct fork_handler, list); + if (p != &malloc_prepare) + free (p); } list_for_each_prev_safe (runp, prevp, &__fork_parent_list) @@ -45,7 +55,9 @@ __unregister_atfork (dso_handle) { list_del (runp); - free (list_entry (runp, struct fork_handler, list)); + struct fork_handler *p = list_entry (runp, struct fork_handler, list); + if (p != &malloc_parent) + free (p); } list_for_each_prev_safe (runp, prevp, &__fork_child_list) @@ -53,7 +65,9 @@ __unregister_atfork (dso_handle) { list_del (runp); - free (list_entry (runp, struct fork_handler, list)); + struct fork_handler *p = list_entry (runp, struct fork_handler, list); + if (p != &__pthread_child_handler && p != &malloc_child) + free (p); } /* Release the lock. */ -- cgit 1.4.1