mirror of
https://github.com/ruby/ruby.git
synced 2025-09-16 17:14:01 +02:00
* 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 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@45120 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
64e6dd621a
commit
d439b3b1d9
4 changed files with 38 additions and 11 deletions
|
@ -1,3 +1,9 @@
|
|||
Sat Feb 22 16:17:54 2014 Eric Wong <e@80x24.org>
|
||||
|
||||
* 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 15:56:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* thread_pthread.c (rb_thread_create_timer_thread): fix for platforms
|
||||
|
|
|
@ -1280,12 +1280,11 @@ bsock_sendmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock)
|
|||
|
||||
ss = rb_sendmsg(fptr->fd, &mh, flags);
|
||||
|
||||
if (ss == -1) {
|
||||
if (!nonblock && rb_io_wait_writable(fptr->fd)) {
|
||||
rb_io_check_closed(fptr);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (ss == -1) {
|
||||
if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
|
||||
rb_readwrite_sys_fail(RB_IO_WAIT_WRITABLE, "sendmsg(2) would block");
|
||||
rb_sys_fail("sendmsg(2)");
|
||||
|
@ -1595,12 +1594,11 @@ bsock_recvmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock)
|
|||
|
||||
ss = rb_recvmsg(fptr->fd, &mh, flags);
|
||||
|
||||
if (ss == -1) {
|
||||
if (!nonblock && rb_io_wait_readable(fptr->fd)) {
|
||||
rb_io_check_closed(fptr);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (ss == -1) {
|
||||
if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
|
||||
rb_readwrite_sys_fail(RB_IO_WAIT_READABLE, "recvmsg(2) would block");
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
|
|
|
@ -5,6 +5,7 @@ end
|
|||
|
||||
require "test/unit"
|
||||
require "tempfile"
|
||||
require "timeout"
|
||||
require "tmpdir"
|
||||
require "thread"
|
||||
require "io/nonblock"
|
||||
|
@ -369,6 +370,28 @@ class TestSocket_UNIXSocket < Test::Unit::TestCase
|
|||
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)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#define RUBY_VERSION "2.1.1"
|
||||
#define RUBY_RELEASE_DATE "2014-02-22"
|
||||
#define RUBY_PATCHLEVEL 64
|
||||
#define RUBY_PATCHLEVEL 65
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2014
|
||||
#define RUBY_RELEASE_MONTH 2
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue