Browse Source

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
OPENBSD_5_6
tedu 10 years ago
parent
commit
4514bdd79a
2 changed files with 13 additions and 21 deletions
  1. +12
    -3
      src/lib/libc/stdlib/abort.3
  2. +1
    -18
      src/lib/libc/stdlib/abort.c

+ 12
- 3
src/lib/libc/stdlib/abort.3 View File

@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dt ABORT 3
.Os .Os
.Sh NAME .Sh NAME
@ -48,7 +48,8 @@ function causes abnormal program termination to occur, unless the signal
.Dv SIGABRT .Dv SIGABRT
is being caught and the signal handler does not return. is being caught and the signal handler does not return.
.Pp .Pp
Any open streams are flushed and closed.
Some implementations may flush output streams before terminating.
This implementation does not.
.Sh RETURN VALUES .Sh RETURN VALUES
The The
.Fn abort .Fn abort
@ -66,3 +67,11 @@ The
.Fn abort .Fn abort
function first appeared in function first appeared in
.At v5 . .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.

+ 1
- 18
src/lib/libc/stdlib/abort.c View 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. * Copyright (c) 1985 Regents of the University of California.
* All rights reserved. * All rights reserved.
@ -39,8 +39,6 @@ int _thread_sys_sigprocmask(int, const sigset_t *, sigset_t *);
void void
abort(void) abort(void)
{ {
struct atexit *p = __atexit;
static int cleanup_called = 0;
sigset_t mask; sigset_t mask;
@ -52,21 +50,6 @@ abort(void)
sigdelset(&mask, SIGABRT); sigdelset(&mask, SIGABRT);
(void)_thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); (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); (void)raise(SIGABRT);
/* /*


Loading…
Cancel
Save