Make sure non-aborting signal handlers save and restore errno
authorSimon McVittie <smcv@collabora.com>
Wed, 27 Sep 2017 12:56:34 +0000 (13:56 +0100)
committerSimon McVittie <smcv@collabora.com>
Wed, 27 Sep 2017 14:14:12 +0000 (15:14 +0100)
commit3d538ced103c7955e6e62a72866e0f56cf3f52d6
tree456e560503b59bff493ad1047b2cd43b84f94929
parent3d557ff7b155d1e0f1cdbfd82cff0ac7ed1b7c4b
Make sure non-aborting signal handlers save and restore errno

If an async signal interrupts some function, we can have this
anti-pattern:

    /* in normal code */
    result = some_syscall (); /* fails, e.g. errno = EINVAL */

        /* interrupted by async signal handler */
        write (...); /* fails, e.g. errno = ENOBUFS */

    /* back to normal code */
    if (errno == EINVAL) /* problem! it should be but it isn't */

The solution is for signal handlers to save and restore errno.

This is unnecessary for signal handlers that can't touch errno (like
the one in dbus-launch that just sets a flag), and for signal handlers
that never return (like the one in test-utils-glib for timeouts).

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=103010
Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
bus/main.c
dbus/dbus-spawn.c