Project

General

Profile

Actions

Bug #14882

closed

OpenSSL::PKey::*.new does not resume after spurious signals

Added by normalperson (Eric Wong) over 6 years ago. Updated over 6 years ago.

Status:
Third Party's Issue
Target version:
-
[ruby-core:87709]

Description

I noticed some OpenSSL::PKey::*.new failures while working on [Bug #14867].

MJIT will fork processes and when they die, SIGCHLD will trigger on most OSes.
I work around this problem in ext/openssl (and possibly other exts) by
avoiding signal_enqueue if no Ruby-level trap(:CHLD) handler is defined:

(in signal.c::sighandler):

        /* avoid spurious wakeup in main thread iff nobody uses trap(:CHLD) */
        if (vm && ACCESS_ONCE(VALUE, vm->trap_list.cmd[sig])) {
            signal_enque(sig);
        }

However, other signals may be received that do not intend to permanently
stop the operation.

Attached is a script which demonstrates the problem.

When performing normal interruptible operations (e.g. IO#read),
Ruby automatically retries on EINTR, so I think OpenSSL::PKey::*.new
should do the same instead of failing completely.


I do not use proprietary messaging systems, so please forward to
the other bug tracker if you don't want to use this one.  Thanks.

Files

ossl_pkey_intr.rb (390 Bytes) ossl_pkey_intr.rb normalperson (Eric Wong), 06/30/2018 03:41 AM

Updated by rhenium (Kazuki Yamaguchi) over 6 years ago

  • Status changed from Open to Third Party's Issue

Thank you for the report. I made a GitHub PR that fixes the bug at the GitHub repo (add .patch to the URL for "git format-patch"-style diff):

https://github.com/ruby/openssl/pull/205

Actions

Also available in: Atom PDF

Like0
Like0