Skip to content

Commit 3b65fac

Browse files
committed
merge revision(s) 45066: [Backport ruby#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 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@45093 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent bf37857 commit 3b65fac

4 files changed

Lines changed: 38 additions & 11 deletions

File tree

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Sat Feb 22 10:09:42 2014 Eric Wong <e@80x24.org>
2+
3+
* ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
4+
(bsock_recvmsg_internal): ditto
5+
* test/socket/test_unix.rb: test above for infinite loop
6+
17
Sat Feb 22 09:51:53 2014 Shugo Maeda <shugo@ruby-lang.org>
28

39
* ext/socket/init.c (wait_connectable): break if the socket is

ext/socket/ancdata.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,12 +1277,11 @@ bsock_sendmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock)
12771277

12781278
ss = rb_sendmsg(fptr->fd, &mh, flags);
12791279

1280-
if (!nonblock && rb_io_wait_writable(fptr->fd)) {
1281-
rb_io_check_closed(fptr);
1282-
goto retry;
1283-
}
1284-
12851280
if (ss == -1) {
1281+
if (!nonblock && rb_io_wait_writable(fptr->fd)) {
1282+
rb_io_check_closed(fptr);
1283+
goto retry;
1284+
}
12861285
if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
12871286
rb_mod_sys_fail(rb_mWaitWritable, "sendmsg(2) would block");
12881287
rb_sys_fail("sendmsg(2)");
@@ -1575,12 +1574,11 @@ bsock_recvmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock)
15751574

15761575
ss = rb_recvmsg(fptr->fd, &mh, flags);
15771576

1578-
if (!nonblock && rb_io_wait_readable(fptr->fd)) {
1579-
rb_io_check_closed(fptr);
1580-
goto retry;
1581-
}
1582-
15831577
if (ss == -1) {
1578+
if (!nonblock && rb_io_wait_readable(fptr->fd)) {
1579+
rb_io_check_closed(fptr);
1580+
goto retry;
1581+
}
15841582
if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN))
15851583
rb_mod_sys_fail(rb_mWaitReadable, "recvmsg(2) would block");
15861584
#if defined(HAVE_ST_MSG_CONTROL)

test/socket/test_unix.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
require "test/unit"
77
require "tempfile"
8+
require "timeout"
89
require "tmpdir"
910
require "thread"
1011
require "io/nonblock"
@@ -348,6 +349,28 @@ def test_dgram_pair
348349
s2.close if s2
349350
end
350351

352+
def test_dgram_pair_sendrecvmsg_errno_set
353+
s1, s2 = to_close = UNIXSocket.pair(Socket::SOCK_DGRAM)
354+
pipe = IO.pipe
355+
to_close.concat(pipe)
356+
set_errno = lambda do
357+
begin
358+
pipe[0].read_nonblock(1)
359+
fail
360+
rescue => e
361+
assert(IO::EAGAINWaitReadable === e)
362+
end
363+
end
364+
Timeout.timeout(10) do
365+
set_errno.call
366+
assert_equal(2, s1.sendmsg("HI"))
367+
set_errno.call
368+
assert_equal("HI", s2.recvmsg[0])
369+
end
370+
ensure
371+
to_close.each(&:close) if to_close
372+
end
373+
351374
def test_epipe # [ruby-dev:34619]
352375
s1, s2 = UNIXSocket.pair
353376
s1.shutdown(Socket::SHUT_WR)

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define RUBY_VERSION "1.9.3"
2-
#define RUBY_PATCHLEVEL 539
2+
#define RUBY_PATCHLEVEL 540
33

44
#define RUBY_RELEASE_DATE "2014-02-22"
55
#define RUBY_RELEASE_YEAR 2014

0 commit comments

Comments
 (0)