[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