Issue #14882 has been reported by normalperson (Eric Wong).

----------------------------------------
Bug #14882: OpenSSL::PKey::*.new does not resume after spurious signals
https://bugs.ruby-lang.org/issues/14882

* Author: normalperson (Eric Wong)
* Status: Open
* 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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>