Issue #9356 has been updated by Shugo Maeda.


Eric Wong wrote:
>  > >  However, I still prefer my v2 if possible:
>  > >    http://bogomips.org/ruby.git/patch?id=f5e2eb00e5
>  > 
>  > I prefer the latter too, but is `break` missing in the case clause?
>  
>  I don't usually add it for the last case... Do some compilers need it?

It's OK if it's your style.  I just noticed it when I was trying to add an extra case clause for ERESTART.

>  >         sockerrlen = (socklen_t)sizeof(sockerr);
>  >         if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&sockerr, &sockerrlen) < 0)
>  >             return -1;
>  >         if (sockerr != 0) {
>  >             errno = sockerr;
>  
>  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?

>  Here is what I think happened in Charlie's original case:
>  
>  	connect() -> EINTR, kernel socket remembers this!
>  	retry connect() -> EALREADY
>  	wait_connectable()
>  	    rb_wait_for_single_fd() -> success
>  	    getsockopt(SO_ERROR), sockerr = EINTR from first connect!
>  	    errno = sockerr -> raise :(

Charlie said Errno::ENOTCONN is raised by TCPSocket#write, not by TCPSocket.new.
I don't know why....

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

* 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/