Issue #9356 has been updated by Eric Wong.


 shugo / ruby-lang.org wrote:
 > Eric Wong wrote:
 > >  We should guard against sockerr setting errno to
 > >  EINTR, ERESTART, EINPROGRESS, EALREADY, EISCONN here...
 > 
 > Agreed.  You mean to expose only usual errors to users and to hide unusual
 > platform-dependent errors, right?
 
 Yes, because we already handle most of those with rb_wait_for_single_fd.
 
 http://bogomips.org/ruby.git/patch?id=d8241102f54
   git://80x24.org/ruby socket-connect-check-v4
 
 > Charlie said Errno::ENOTCONN is raised by TCPSocket#write, not by TCPSocket.new.
 > I don't know why....
 
 Maybe one additional change helps:
 http://bogomips.org/ruby.git/patch?id=66ca3633f43
   git://80x24.org/ruby socket-connect-check-v5
 
 I'm out of ideas.  Charlie?

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

* 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)
wait_connectable_infinite_loop_minimal_fix.diff (478 Bytes)


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