Issue #9356 has been updated by Eric Wong.


 "U.Nakamura" <usa / garbagecollect.jp> wrote:
 > In message "[ruby-core:60819] [ruby-trunk - Bug #9356] TCPSocket.new does not seem to handle INTR"
 >     on Feb.18,2014 18:34:40, <shugo / ruby-lang.org> wrote:
 > > Does anybody know why the following code in ext/socket/init.c is necessary?
 > > 
 > >             if (sockerr == 0)
 > >                 continue;       /* workaround for winsock */
 > 
 > It was introduced at r7931 by me (9 years ago!),
 > but I forgot the reason.
 > If my comment of those days is believed, we may wrap it
 > with #ifdef_WIN32.
 
 OK.  I wonder if we should even use getsockopt(SO_ERROR) at all.
 
 I know there's much literature which recommends it, but any error check
 in this way is racy.  Better to let any subsequent
 write/read/send/recv/etc error out.
 
 The following should work:
 
   connect() -> EINPROGRESS
   rb_wait_for_single_fd -> (must retry on EINTR)
   (user calls) write() -> 0, ENOTCONN, EPIPE, ...
 
 Note: rb_wait_for_single_fd is necessary in FreeBSD (at least) to avoid
 ENOTCONN, Linux just returns EAGAIN on write if write immediately after
 connect.

----------------------------------------
Bug #9356: TCPSocket.new does not seem to handle INTR
https://bugs.ruby-lang.org/issues/9356#change-45238

* Author: Charlie Somerville
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: -
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
TCPSocket.new does not seem to handle EINTR properly.

In the attached test script, I try to open a TCP connection to my server and make an HTTP request while a background thread continually sends a signal to the process.

This causes the #write call to fail with:

x.rb:13:in `write': Socket is not connected (Errno::ENOTCONN)
	from x.rb:13:in `<main>'

This also appears to affect 2.0.0. 1.9.3 is unaffected.

---Files--------------------------------
socket-eintr.rb (207 Bytes)


-- 
http://bugs.ruby-lang.org/