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.gregor...@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);
>  }
>  
> 

Reply via email to