summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib')
-rw-r--r--src/lib/libc/stdlib/atexit.c20
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
40struct atexit *__atexit; 41struct 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/*