From 0a881f81b1d897740ec5a91c0f4a1bbccfe0c00a Mon Sep 17 00:00:00 2001 From: charliesome Date: Thu, 23 Jan 2014 05:07:48 +0000 Subject: * process.c (recv_child_error): Fix deadlock in rb_fork_internal when a signal is sent to the parent process while Ruby is forking in IO.popen. Patch by Scott Francis. Closes GH-513. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44687 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'process.c') diff --git a/process.c b/process.c index f5d84973c4..6c29423574 100644 --- a/process.c +++ b/process.c @@ -3339,8 +3339,11 @@ recv_child_error(int fd, int *statep, VALUE *excp, int *errp, char *errmsg, size } #define READ_FROM_CHILD(ptr, len) \ (NIL_P(io) ? read(fd, (ptr), (len)) : rb_io_bufread(io, (ptr), (len))) - if ((size = READ_FROM_CHILD(&err, sizeof(err))) < 0) { + while ((size = READ_FROM_CHILD(&err, sizeof(err))) < 0) { err = errno; + if (err != EINTR) { + break; + } } *errp = err; if (size == sizeof(err) && -- cgit v1.2.3