diff options
Diffstat (limited to 'src/lib/libc/stdlib')
-rw-r--r-- | src/lib/libc/stdlib/atexit.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/lib/libc/stdlib/atexit.c b/src/lib/libc/stdlib/atexit.c index 6532b382ea..a33080571f 100644 --- a/src/lib/libc/stdlib/atexit.c +++ b/src/lib/libc/stdlib/atexit.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: atexit.c,v 1.20 2014/07/11 09:51:37 kettenis Exp $ */ | 1 | /* $OpenBSD: atexit.c,v 1.21 2015/04/07 01:27:07 guenther Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2002 Daniel Hartmeier | 3 | * Copyright (c) 2002 Daniel Hartmeier |
4 | * All rights reserved. | 4 | * All rights reserved. |
@@ -35,6 +35,7 @@ | |||
35 | #include <string.h> | 35 | #include <string.h> |
36 | #include <unistd.h> | 36 | #include <unistd.h> |
37 | #include "atexit.h" | 37 | #include "atexit.h" |
38 | #include "atfork.h" | ||
38 | #include "thread_private.h" | 39 | #include "thread_private.h" |
39 | 40 | ||
40 | struct atexit *__atexit; | 41 | struct atexit *__atexit; |
@@ -161,6 +162,23 @@ restart: | |||
161 | __atexit = NULL; | 162 | __atexit = NULL; |
162 | } | 163 | } |
163 | _ATEXIT_UNLOCK(); | 164 | _ATEXIT_UNLOCK(); |
165 | |||
166 | /* | ||
167 | * If unloading a DSO, unregister any atfork handlers registered | ||
168 | * by it. Skip the locking if the list is currently empty. | ||
169 | */ | ||
170 | if (dso != NULL && TAILQ_FIRST(&_atfork_list) != NULL) { | ||
171 | struct atfork_fn *af, *afnext; | ||
172 | |||
173 | _ATFORK_LOCK(); | ||
174 | TAILQ_FOREACH_SAFE(af, &_atfork_list, fn_next, afnext) | ||
175 | if (af->fn_dso == dso) { | ||
176 | TAILQ_REMOVE(&_atfork_list, af, fn_next); | ||
177 | free(af); | ||
178 | } | ||
179 | _ATFORK_UNLOCK(); | ||
180 | |||
181 | } | ||
164 | } | 182 | } |
165 | 183 | ||
166 | /* | 184 | /* |