From d33c7cba557ae40fb55446d841e084a74eacb425 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 9 Mar 2015 21:18:00 +0000 Subject: preserve errno when inside sig handler for self-pipe We must not clobber errno of the main thread inside signal handler in case write fails. This bug only affects systems without epoll_pwait where the self-pipe is required, so it does not affect modern GNU/Linux systems; but does affect FreeBSD systems and anybody else relying on kqueue. Thanks to Steven Stewart-Gallus for a Ruby bug report which inspired this fix: https://bugs.ruby-lang.org/issues/10866 Cc: Mykola Golub Cc: Steven Stewart-Gallus --- selfwake.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/selfwake.c b/selfwake.c index 1a6908b..06e9d62 100644 --- a/selfwake.c +++ b/selfwake.c @@ -42,8 +42,7 @@ void mog_selfwake_wait(struct mog_fd *mfd) mog_selfwake_drain(mfd); } -/* this is async-signal safe (except in the case of bugs) */ -void mog_selfwake_trigger(struct mog_fd *mfd) +static void selfwake_trigger(struct mog_fd *mfd) { ssize_t w; @@ -64,6 +63,12 @@ retry: abort(); } +/* this is async-signal safe (except in the case of our usage bugs) */ +void mog_selfwake_trigger(struct mog_fd *mfd) +{ + PRESERVE_ERRNO(selfwake_trigger(mfd)); +} + void mog_selfwake_drain(struct mog_fd *mfd) { ssize_t r; -- cgit v1.2.3-24-ge0c7