From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: cmogstored-public@bogomips.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E37361F5AF; Mon, 9 Mar 2015 21:39:46 +0000 (UTC) Date: Mon, 9 Mar 2015 21:39:49 +0000 From: Eric Wong To: cmogstored-public@bogomips.org Cc: Mykola Golub , Steven Stewart-Gallus Subject: [PATCH] preserve errno when inside sig handler for self-pipe Message-ID: <20150309213949.GA8778@dcvr.yhbt.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline List-Archive: List-Id: 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 --- Steven: just wanted you to know your original bug report went a long way :) 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; -- EW