From: shugo@... Date: 2014-02-21T08:17:16+00:00 Subject: [ruby-core:60933] [ruby-trunk - Bug #9356] TCPSocket.new does not seem to handle INTR 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 `
' This also appears to affect 2.0.0. 1.9.3 is unaffected. ---Files-------------------------------- socket-eintr.rb (207 Bytes) -- http://bugs.ruby-lang.org/