All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] catch signals
Date: Wed, 6 Aug 2008 10:48:53 +0100	[thread overview]
Message-ID: <20080806094853.GF9055@redhat.com> (raw)
In-Reply-To: <48996CE7.5010205@redhat.com>

On Wed, Aug 06, 2008 at 11:20:39AM +0200, Gerd Hoffmann wrote:
> Daniel P. Berrange wrote:
> > On Tue, Aug 05, 2008 at 06:09:39PM +0200, Gerd Hoffmann wrote:
> >>  
> >> +#ifndef _WIN32
> >> +static void termsig_handler(int signal)
> >> +{
> >> +    switch (signal) {
> >> +    case SIGSEGV:
> >> +    case SIGBUS:
> >> +        /* returning from signal handler most likely isn't going to work */
> >> +        fprintf(stderr, "qemu: got signal %d (%s), taking emergency exit\n",
> >> +                signal, strsignal(signal));
> >> +        exit(1);
> > 
> > Neither of these functions are on the POSIX  async-signal-safe list,
> > so their use from signal handlers is not a good idea.
> 
> We are in dead water already and also don't plan to ever return from the
>  signal handler.  Is it really a problem then?

Yes, because if you further corrupt state in the signal handler it makes
debugging what went wrong even harder than it already is. In SEGV/BUS
case you really want to be able to get a decent core dump to analyse, so
the utmost care should be taken to avoid further messing up state. 

The STDIO libs are not re-entrant safe so if the original code was in a
STDIO function, and a SEGV comes in on another thread, the signal handler
will likely deadlock in a mutex. 'exit' will call into STDIO to flush
buffers, so will suffer the same problem.

> I want to be able to do cleanups (well, at least attempt) even in case
> of a segfault.  If exit() + atexit handlers isn't going to fill the bill
> we'll have to create some signal-save emergency cleanup handlers.

You could use 'sigaltstack' to setup an alternate pre-allocated stack
and carefully code the handler so it only uses pre-allocated memory,
or mem from the alt-stack & signal-safe functions. If you need something
really complex, you could 'fork' a cleanup program and communicate any
info to it using a pipe.

Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

  reply	other threads:[~2008-08-06  9:49 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-05 16:09 [Qemu-devel] [PATCH] catch signals Gerd Hoffmann
2008-08-05 16:29 ` Samuel Thibault
2008-08-06  9:11   ` Gerd Hoffmann
2008-08-05 16:35 ` Daniel P. Berrange
2008-08-05 16:53   ` Samuel Thibault
2008-08-05 17:00     ` Daniel P. Berrange
2008-08-05 18:39       ` Jamie Lokier
2008-08-06  9:20   ` Gerd Hoffmann
2008-08-06  9:48     ` Daniel P. Berrange [this message]
2008-08-11 16:50 ` Ian Jackson
2008-08-11 19:43   ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080806094853.GF9055@redhat.com \
    --to=berrange@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.