[前][次][番号順一覧][スレッド一覧]

ruby-changes:33014

From: usa <ko1@a...>
Date: Sat, 22 Feb 2014 10:11:13 +0900 (JST)
Subject: [ruby-changes:33014] usa:r45093 (ruby_1_9_3): merge revision(s) 45066: [Backport #9550]

usa	2014-02-22 10:11:06 +0900 (Sat, 22 Feb 2014)

  New Revision: 45093

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=45093

  Log:
    merge revision(s) 45066: [Backport #9550]
    
    * ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
      (bsock_recvmsg_internal): ditto
    
    * test/socket/test_unix.rb: test above for infinite loop

  Modified directories:
    branches/ruby_1_9_3/
  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/ext/socket/ancdata.c
    branches/ruby_1_9_3/test/socket/test_unix.rb
    branches/ruby_1_9_3/version.h
Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 45092)
+++ ruby_1_9_3/ChangeLog	(revision 45093)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/ChangeLog#L1
+Sat Feb 22 10:09:42 2014  Eric Wong  <e@8...>
+
+	* ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
+	  (bsock_recvmsg_internal): ditto
+	* test/socket/test_unix.rb: test above for infinite loop
+
 Sat Feb 22 09:51:53 2014  Shugo Maeda  <shugo@r...>
 
 	* ext/socket/init.c (wait_connectable): break if the socket is
Index: ruby_1_9_3/ext/socket/ancdata.c
===================================================================
--- ruby_1_9_3/ext/socket/ancdata.c	(revision 45092)
+++ ruby_1_9_3/ext/socket/ancdata.c	(revision 45093)
@@ -1277,12 +1277,11 @@ bsock_sendmsg_internal(int argc, VALUE * https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/ext/socket/ancdata.c#L1277
 
     ss = rb_sendmsg(fptr->fd, &mh, flags);
 
-    if (!nonblock && rb_io_wait_writable(fptr->fd)) {
-        rb_io_check_closed(fptr);
-        goto retry;
-    }
-
     if (ss == -1) {
+        if (!nonblock && rb_io_wait_writable(fptr->fd)) {
+            rb_io_check_closed(fptr);
+            goto retry;
+        }
         if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
             rb_mod_sys_fail(rb_mWaitWritable, "sendmsg(2) would block");
 	rb_sys_fail("sendmsg(2)");
@@ -1575,12 +1574,11 @@ bsock_recvmsg_internal(int argc, VALUE * https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/ext/socket/ancdata.c#L1574
 
     ss = rb_recvmsg(fptr->fd, &mh, flags);
 
-    if (!nonblock && rb_io_wait_readable(fptr->fd)) {
-        rb_io_check_closed(fptr);
-        goto retry;
-    }
-
     if (ss == -1) {
+        if (!nonblock && rb_io_wait_readable(fptr->fd)) {
+            rb_io_check_closed(fptr);
+            goto retry;
+        }
         if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
             rb_mod_sys_fail(rb_mWaitReadable, "recvmsg(2) would block");
 #if defined(HAVE_ST_MSG_CONTROL)
Index: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 45092)
+++ ruby_1_9_3/version.h	(revision 45093)
@@ -1,5 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/version.h#L1
 #define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 539
+#define RUBY_PATCHLEVEL 540
 
 #define RUBY_RELEASE_DATE "2014-02-22"
 #define RUBY_RELEASE_YEAR 2014
Index: ruby_1_9_3/test/socket/test_unix.rb
===================================================================
--- ruby_1_9_3/test/socket/test_unix.rb	(revision 45092)
+++ ruby_1_9_3/test/socket/test_unix.rb	(revision 45093)
@@ -5,6 +5,7 @@ end https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/test/socket/test_unix.rb#L5
 
 require "test/unit"
 require "tempfile"
+require "timeout"
 require "tmpdir"
 require "thread"
 require "io/nonblock"
@@ -348,6 +349,28 @@ class TestSocket_UNIXSocket < Test::Unit https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/test/socket/test_unix.rb#L349
     s2.close if s2
   end
 
+  def test_dgram_pair_sendrecvmsg_errno_set
+    s1, s2 = to_close = UNIXSocket.pair(Socket::SOCK_DGRAM)
+    pipe = IO.pipe
+    to_close.concat(pipe)
+    set_errno = lambda do
+      begin
+        pipe[0].read_nonblock(1)
+        fail
+      rescue => e
+        assert(IO::EAGAINWaitReadable === e)
+      end
+    end
+    Timeout.timeout(10) do
+      set_errno.call
+      assert_equal(2, s1.sendmsg("HI"))
+      set_errno.call
+      assert_equal("HI", s2.recvmsg[0])
+    end
+  ensure
+    to_close.each(&:close) if to_close
+  end
+
   def test_epipe # [ruby-dev:34619]
     s1, s2 = UNIXSocket.pair
     s1.shutdown(Socket::SHUT_WR)

Property changes on: ruby_1_9_3
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r45066


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]