2024-01-01 18:12:26 +00:00
|
|
|
/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
|
2005-12-14 08:43:25 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2005-12-14 08:43:25 +00:00
|
|
|
|
2015-09-08 21:11:03 +00:00
|
|
|
#include <libc-lock.h>
|
2005-12-14 08:43:25 +00:00
|
|
|
#include <signal.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
2022-04-21 12:41:59 +00:00
|
|
|
#include <internal-signals.h>
|
2005-12-14 08:43:25 +00:00
|
|
|
|
|
|
|
/* Try to get a machine dependent instruction which will make the
|
|
|
|
program crash. This is used in case everything else fails. */
|
|
|
|
#include <abort-instr.h>
|
|
|
|
#ifndef ABORT_INSTRUCTION
|
|
|
|
/* No such instruction is available. */
|
|
|
|
# define ABORT_INSTRUCTION
|
|
|
|
#endif
|
|
|
|
|
2009-06-15 23:17:09 +00:00
|
|
|
/* Exported variable to locate abort message in core files etc. */
|
2021-07-09 18:09:14 +00:00
|
|
|
struct abort_msg_s *__abort_msg;
|
2009-06-15 23:17:09 +00:00
|
|
|
libc_hidden_def (__abort_msg)
|
|
|
|
|
2005-12-14 08:43:25 +00:00
|
|
|
/* We must avoid to run in circles. Therefore we remember how far we
|
|
|
|
already got. */
|
|
|
|
static int stage;
|
|
|
|
|
|
|
|
/* We should be prepared for multiple threads trying to run abort. */
|
|
|
|
__libc_lock_define_initialized_recursive (static, lock);
|
|
|
|
|
|
|
|
|
|
|
|
/* Cause an abnormal program termination with core-dump. */
|
|
|
|
void
|
|
|
|
abort (void)
|
|
|
|
{
|
|
|
|
struct sigaction act;
|
|
|
|
|
|
|
|
/* First acquire the lock. */
|
|
|
|
__libc_lock_lock_recursive (lock);
|
|
|
|
|
|
|
|
/* Now it's for sure we are alone. But recursive calls are possible. */
|
|
|
|
|
Remove __need macros from signal.h.
The types affected are __sig_atomic_t, sig_atomic_t, __sigset_t,
sigset_t, sigval_t, sigevent_t, and siginfo_t. __sig_atomic_t is a
scalar, so it's now directly available from bits/types.h. The others
get bits/types/ headers.
Side effects include: There have been small changes to which
non-signal headers expose which subset of the signal-related types.
A couple of architectures' nested siginfo_t fields had to be renamed
to prevent undesired macro expansion. Internal code that wants to
manipulate signal masks must now include <sigsetops.h> (which is not
installed) and should be aware that __sigaddset, __sigandset,
__sigdelset, __sigemptyset, and __sigorset no longer return a value
(unlike the public API). Relatedly, the public signal.h no longer
declares any of those functions. The obsolete sigmask() macro no
longer has a system-specific definition -- in the cases where it
matters, it didn't work anyway.
New Linux architectures should create bits/siginfo-arch.h and/or
bits/siginfo-consts-arch.h to customize their siginfo_t, rather than
duplicating everything in bits/siginfo.h (which no longer exists).
Add new __SI_* macros if necessary. Ports to other operating systems
are strongly encouraged to generalize this scheme further.
* bits/sigevent-consts.h
* bits/siginfo-consts.h
* bits/types/__sigset_t.h
* bits/types/sigevent_t.h
* bits/types/siginfo_t.h
* sysdeps/unix/sysv/linux/bits/sigevent-consts.h
* sysdeps/unix/sysv/linux/bits/siginfo-consts.h
* sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
* sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
* sysdeps/unix/sysv/linux/bits/types/siginfo_t.h:
New system-dependent bits headers.
* sysdeps/unix/sysv/linux/bits/siginfo-arch.h
* sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
* sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
* sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
* sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
* sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
* sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
* sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
* sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h:
New Linux-only system-dependent bits headers.
* signal/bits/types/sig_atomic_t.h
* signal/bits/types/sigset_t.h
* signal/bits/types/sigval_t.h:
New non-system-dependent bits headers.
* sysdeps/generic/sigsetops.h
* sysdeps/unix/sysv/linux/sigsetops.h:
New internal headers.
* include/bits/types/sig_atomic_t.h
* include/bits/types/sigset_t.h
* include/bits/types/sigval_t.h:
New wrappers.
* signal/sigsetops.h
* bits/siginfo.h
* bits/sigset.h
* sysdeps/unix/sysv/linux/bits/siginfo.h
* sysdeps/unix/sysv/linux/bits/sigset.h
* sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
* sysdeps/unix/sysv/linux/mips/bits/siginfo.h
* sysdeps/unix/sysv/linux/s390/bits/siginfo.h
* sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
* sysdeps/unix/sysv/linux/tile/bits/siginfo.h
* sysdeps/unix/sysv/linux/x86/bits/siginfo.h:
Deleted.
* signal/Makefile, sysdeps/unix/sysv/linux/Makefile:
Update lists of installed headers.
* posix/bits/types.h: Define __sig_atomic_t here.
* signal/signal.h: Use the new bits headers; no need to handle
__need_sig_atomic_t nor __need_sigset_t. Don't use __sigmask
to define sigmask.
* include/signal.h: No need to handle __need_sig_atomic_t
nor __need_sigset_t. Don't define __sigemptyset.
* io/sys/poll.h, setjmp/setjmp.h
* sysdeps/arm/sys/ucontext.h, sysdeps/generic/sys/ucontext.h
* sysdeps/i386/sys/ucontext.h, sysdeps/m68k/sys/ucontext.h
* sysdeps/mach/hurd/i386/bits/sigcontext.h
* sysdeps/mips/sys/ucontext.h, sysdeps/powerpc/novmxsetjmp.h
* sysdeps/pthread/bits/sigthread.h
* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
* sysdeps/unix/sysv/linux/mips/sys/ucontext.h
* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
* sysdeps/unix/sysv/linux/s390/sys/ucontext.h
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h
* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
* sysdeps/unix/sysv/linux/tile/sys/ucontext.h
* sysdeps/unix/sysv/linux/x86/sys/ucontext.h:
Use bits/types/__sigset_t.h.
* misc/sys/select.h, posix/spawn.h
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
* sysdeps/unix/sysv/linux/sys/epoll.h
* sysdeps/unix/sysv/linux/sys/signalfd.h:
Use bits/types/sigset_t.h.
* resolv/netdb.h, rt/mqueue.h: Use bits/types/sigevent_t.h.
* rt/aio.h: Use bits/types/sigevent_t.h and bits/sigevent-consts.h.
* socket/sys/socket.h: Don't include bits/sigset.h.
* login/utmp_file.c, shadow/lckpwdf.c, signal/sigandset.c
* signal/sigisempty.c, stdlib/abort.c, sysdeps/posix/profil.c
* sysdeps/posix/sigignore.c, sysdeps/posix/sigintr.c
* sysdeps/posix/signal.c, sysdeps/posix/sigset.c
* sysdeps/posix/sprofil.c, sysdeps/posix/sysv_signal.c
* sysdeps/unix/sysv/linux/nptl-signals.h:
Include sigsetops.h.
* signal/sigaddset.c, signal/sigandset.c, signal/sigdelset.c
* signal/sigorset.c, stdlib/abort.c, sysdeps/posix/sigignore.c
* sysdeps/posix/signal.c, sysdeps/posix/sigset.c:
__sigaddset, __sigandset, __sigdelset, __sigemptyset, __sigorset
now return no value.
* signal/sigaddset.c, signal/sigdelset.c, signal/sigismem.c
Include <errno.h>, <signal.h>, and <sigsetops.h> instead of
"sigsetops.h".
* signal/sigsetops.c: Explicitly define __sigismember,
__sigaddset, and __sigdelset as compatibility symbols.
* signal/Versions: Correct commentary on __sigpause,
__sigaddset, __sigdelset, __sigismember.
* inet/rcmd.c: Include sigsetops.h. Convert old code using
__sigblock/__sigsetmask to use __sigprocmask and friends.
2016-12-02 00:24:13 +00:00
|
|
|
/* Unblock SIGABRT. */
|
2005-12-14 08:43:25 +00:00
|
|
|
if (stage == 0)
|
|
|
|
{
|
|
|
|
++stage;
|
2022-04-21 12:41:59 +00:00
|
|
|
internal_sigset_t sigs;
|
|
|
|
internal_sigemptyset (&sigs);
|
|
|
|
internal_sigaddset (&sigs, SIGABRT);
|
|
|
|
internal_sigprocmask (SIG_UNBLOCK, &sigs, NULL);
|
2005-12-14 08:43:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Send signal which possibly calls a user handler. */
|
2017-10-05 12:48:16 +00:00
|
|
|
if (stage == 1)
|
2005-12-14 08:43:25 +00:00
|
|
|
{
|
|
|
|
/* This stage is special: we must allow repeated calls of
|
|
|
|
`abort' when a user defined handler for SIGABRT is installed.
|
|
|
|
This is risky since the `raise' implementation might also
|
|
|
|
fail but I don't see another possibility. */
|
|
|
|
int save_stage = stage;
|
|
|
|
|
|
|
|
stage = 0;
|
|
|
|
__libc_lock_unlock_recursive (lock);
|
|
|
|
|
|
|
|
raise (SIGABRT);
|
|
|
|
|
|
|
|
__libc_lock_lock_recursive (lock);
|
|
|
|
stage = save_stage + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* There was a handler installed. Now remove it. */
|
2017-10-05 12:48:16 +00:00
|
|
|
if (stage == 2)
|
2005-12-14 08:43:25 +00:00
|
|
|
{
|
|
|
|
++stage;
|
|
|
|
memset (&act, '\0', sizeof (struct sigaction));
|
|
|
|
act.sa_handler = SIG_DFL;
|
|
|
|
__sigfillset (&act.sa_mask);
|
|
|
|
act.sa_flags = 0;
|
|
|
|
__sigaction (SIGABRT, &act, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try again. */
|
2017-10-05 12:48:16 +00:00
|
|
|
if (stage == 3)
|
2005-12-14 08:43:25 +00:00
|
|
|
{
|
|
|
|
++stage;
|
|
|
|
raise (SIGABRT);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now try to abort using the system specific command. */
|
2017-10-05 12:48:16 +00:00
|
|
|
if (stage == 4)
|
2005-12-14 08:43:25 +00:00
|
|
|
{
|
|
|
|
++stage;
|
|
|
|
ABORT_INSTRUCTION;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If we can't signal ourselves and the abort instruction failed, exit. */
|
2017-10-05 12:48:16 +00:00
|
|
|
if (stage == 5)
|
2005-12-14 08:43:25 +00:00
|
|
|
{
|
|
|
|
++stage;
|
|
|
|
_exit (127);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If even this fails try to use the provided instruction to crash
|
|
|
|
or otherwise make sure we never return. */
|
|
|
|
while (1)
|
|
|
|
/* Try for ever and ever. */
|
|
|
|
ABORT_INSTRUCTION;
|
|
|
|
}
|
|
|
|
libc_hidden_def (abort)
|