diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-27 23:26:48 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-27 23:26:48 +0000 |
commit | ba5eb6458a7e9a41ee76cfe45b84f997600681dc (patch) | |
tree | ea30634bcd2bb2f3886ad8fed3224d6f751af34d /ext/socket/lib/socket.rb | |
parent | c3bbc2ffd5bbd9d5951d7cacd19e3b21f3d447ff (diff) | |
download | ruby-ba5eb6458a7e9a41ee76cfe45b84f997600681dc.tar.gz |
socket: fix BasicSocket#*_nonblock buffering bugs from r58400
IO#read_nonblock and IO#write_nonblock take into account
buffered data, so the Linux-only BasicSocket#read_nonblock
and BasicSocket#write_nonblock methods must, too.
This bug was only introduced in r58400
("socket: avoid fcntl for read/write_nonblock on Linux")
and does not affect any stable release.
* ext/socket/basicsocket.c (rsock_init_basicsocket):
* ext/socket/init.c (rsock_s_recvfrom_nonblock):
* ext/socket/init.c (rsock_init_socket_init):
* ext/socket/lib/socket.rb (def read_nonblock):
* ext/socket/lib/socket.rb (def write_nonblock):
* ext/socket/rubysocket.h (static inline void rsock_maybe_wait_fd):
* test/socket/test_basicsocket.rb (def test_read_write_nonblock):
[Feature #13362]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/lib/socket.rb')
-rw-r--r-- | ext/socket/lib/socket.rb | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/ext/socket/lib/socket.rb b/ext/socket/lib/socket.rb index 53d961e680..18f79b3f08 100644 --- a/ext/socket/lib/socket.rb +++ b/ext/socket/lib/socket.rb @@ -449,16 +449,11 @@ class BasicSocket < IO # Do other platforms support MSG_DONTWAIT reliably? if RUBY_PLATFORM =~ /linux/ && Socket.const_defined?(:MSG_DONTWAIT) def read_nonblock(len, str = nil, exception: true) # :nodoc: - case rv = __recv_nonblock(len, 0, str, exception) - when '' # recv_nonblock returns empty string on EOF - exception ? raise(EOFError, 'end of file reached') : nil - else - rv - end + __read_nonblock(len, str, exception) end def write_nonblock(buf, exception: true) # :nodoc: - __sendmsg_nonblock(buf, 0, nil, nil, exception) + __write_nonblock(buf, exception) end end end |