summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2014-05-14 21:54:20 +0000
committertedu <tedu@openbsd.org>2014-05-14 21:54:20 +0000
commitc833d94866232a4a304f54e7cb8f024e0a80c671 (patch)
treec424858bd63708455201464c68f5c57947c707bf
parentimprove style - basically, what my fingers did at Marrakesh airport when (diff)
downloadwireguard-openbsd-c833d94866232a4a304f54e7cb8f024e0a80c671.tar.xz
wireguard-openbsd-c833d94866232a4a304f54e7cb8f024e0a80c671.zip
stop flushing streams in abort(). it's hackish and unsafe, and no longer
required. try to document this fact and some of the history. with feedback from deraadt guenther millert
-rw-r--r--lib/libc/stdlib/abort.315
-rw-r--r--lib/libc/stdlib/abort.c19
2 files changed, 13 insertions, 21 deletions
diff --git a/lib/libc/stdlib/abort.3 b/lib/libc/stdlib/abort.3
index 322d6299307..2f15cd827c8 100644
--- a/lib/libc/stdlib/abort.3
+++ b/lib/libc/stdlib/abort.3
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $OpenBSD: abort.3,v 1.10 2013/07/17 05:42:11 schwarze Exp $
+.\" $OpenBSD: abort.3,v 1.11 2014/05/14 21:54:20 tedu Exp $
.\"
-.Dd $Mdocdate: July 17 2013 $
+.Dd $Mdocdate: May 14 2014 $
.Dt ABORT 3
.Os
.Sh NAME
@@ -48,7 +48,8 @@ function causes abnormal program termination to occur, unless the signal
.Dv SIGABRT
is being caught and the signal handler does not return.
.Pp
-Any open streams are flushed and closed.
+Some implementations may flush output streams before terminating.
+This implementation does not.
.Sh RETURN VALUES
The
.Fn abort
@@ -66,3 +67,11 @@ The
.Fn abort
function first appeared in
.At v5 .
+.Pp
+Historically, previous standards required
+.Fn abort
+to flush and close output streams, but this conflicted with the requirement
+that
+.Fn abort
+be async signal safe.
+As a result, the flushing requirement was dropped.
diff --git a/lib/libc/stdlib/abort.c b/lib/libc/stdlib/abort.c
index 4c8dc70a1d5..dd057710ff2 100644
--- a/lib/libc/stdlib/abort.c
+++ b/lib/libc/stdlib/abort.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: abort.c,v 1.16 2012/11/10 03:46:11 guenther Exp $ */
+/* $OpenBSD: abort.c,v 1.17 2014/05/14 21:54:20 tedu Exp $ */
/*
* Copyright (c) 1985 Regents of the University of California.
* All rights reserved.
@@ -39,8 +39,6 @@ int _thread_sys_sigprocmask(int, const sigset_t *, sigset_t *);
void
abort(void)
{
- struct atexit *p = __atexit;
- static int cleanup_called = 0;
sigset_t mask;
@@ -52,21 +50,6 @@ abort(void)
sigdelset(&mask, SIGABRT);
(void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
- /*
- * POSIX requires we flush stdio buffers on abort
- */
- if (cleanup_called == 0) {
- /* the cleanup routine lives in fns[0] on the last page */
- while (p != NULL && p->next != NULL)
- p = p->next;
- /* the check for fn_dso == NULL is mostly paranoia */
- if (p != NULL && p->fns[0].fn_dso == NULL &&
- p->fns[0].fn_ptr.std_func != NULL) {
- cleanup_called = 1;
- (*p->fns[0].fn_ptr.std_func)();
- }
- }
-
(void)raise(SIGABRT);
/*