[pacman-dev] [PATCH 2/2] create coredump on segfault
Allan McRae
allan at archlinux.org
Mon Aug 5 08:18:51 UTC 2019
On 8/6/19 2:12 pm, Andrew Gregory wrote:
> Overriding the segfault handler prevents the creation of core dumps by
> the default handler, which makes debugging segfaults difficult.
>
> Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
> ---
This looks good to me. I did a double take at the underscore leading
the function name, but it turns out we use it elsewhere in pacman.
> src/pacman/sighandler.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c
> index a4849a0c..082756b5 100644
> --- a/src/pacman/sighandler.c
> +++ b/src/pacman/sighandler.c
> @@ -38,6 +38,15 @@ static ssize_t xwrite(int fd, const void *buf, size_t count)
> return ret;
> }
>
> +static void _reset_handler(int signum)
> +{
> + struct sigaction new_action;
> + sigemptyset(&new_action.sa_mask);
> + new_action.sa_handler = SIG_DFL;
> + new_action.sa_flags = 0;
> + sigaction(signum, &new_action, NULL);
> +}
> +
> /** Catches thrown signals. Performs necessary cleanup to ensure database is
> * in a consistent state.
> * @param signum the thrown signal
> @@ -76,19 +85,26 @@ void install_soft_interrupt_handler(void)
>
> void remove_soft_interrupt_handler(void)
> {
> - struct sigaction new_action;
> - sigemptyset(&new_action.sa_mask);
> - new_action.sa_handler = SIG_DFL;
> - new_action.sa_flags = 0;
> - sigaction(SIGINT, &new_action, NULL);
> - sigaction(SIGHUP, &new_action, NULL);
> + _reset_handler(SIGINT);
> + _reset_handler(SIGHUP);
> }
>
> static void segv_handler(int signum)
> {
> + sigset_t segvset;
> const char msg[] = "\nerror: segmentation fault\n"
> "Please submit a full bug report with --debug if appropriate.\n";
> xwrite(STDERR_FILENO, msg, sizeof(msg) - 1);
> +
> + /* restore the default handler */
> + _reset_handler(signum);
> + /* unblock SIGSEGV */
> + sigaddset(&segvset, signum);
> + sigprocmask(SIG_UNBLOCK, &segvset, NULL);
> + /* re-raise to trigger a core dump */
> + raise(signum);
> +
> + /* raise should immediately abort, but just to make absolutely sure */
> _Exit(signum);
> }
>
>
More information about the pacman-dev
mailing list