stop flushing streams in abort(). it's hackish and unsafe, and no longer
authortedu <tedu@openbsd.org>
Wed, 14 May 2014 21:54:20 +0000 (21:54 +0000)
committertedu <tedu@openbsd.org>
Wed, 14 May 2014 21:54:20 +0000 (21:54 +0000)
required. try to document this fact and some of the history.
with feedback from deraadt guenther millert

lib/libc/stdlib/abort.3
lib/libc/stdlib/abort.c

index 322d629..2f15cd8 100644 (file)
@@ -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.
index 4c8dc70..dd05771 100644 (file)
@@ -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);
 
        /*