From: k@... Date: 2018-07-02T14:32:24+00:00 Subject: [ruby-core:87750] [Ruby trunk Bug#14882][Third Party's Issue] OpenSSL::PKey::*.new does not resume after spurious signals Issue #14882 has been updated by rhenium (Kazuki Yamaguchi). 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 ---------------------------------------- Bug #14882: OpenSSL::PKey::*.new does not resume after spurious signals https://bugs.ruby-lang.org/issues/14882#change-72775 * Author: normalperson (Eric Wong) * Status: Third Party's Issue * Priority: Normal * Assignee: rhenium (Kazuki Yamaguchi) * Target version: * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- ``` 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) -- https://bugs.ruby-lang.org/ Unsubscribe: