ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:109961] [Ruby master Bug#19012] BasicSocket#recv* methods return an empty packet instead of nil on closed connections
@ 2022-09-20 13:52 byroot (Jean Boussier)
  2022-09-20 14:13 ` [ruby-core:109962] " byroot (Jean Boussier)
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: byroot (Jean Boussier) @ 2022-09-20 13:52 UTC (permalink / raw)
  To: ruby-core

Issue #19012 has been reported by byroot (Jean Boussier).

----------------------------------------
Bug #19012: BasicSocket#recv* methods return an empty packet instead of nil on closed connections
https://bugs.ruby-lang.org/issues/19012

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
`man recvmsg(2)` states:

> Return Value
> These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.

But somehow the entire `receiv` family of methods in Ruby seem to interpret `0` as empty string instead of "EOF".

```ruby
require 'socket'

puts "=== pipes ==="
r, w = IO.pipe
r.read_nonblock(1, exception: false) # => :wait_readable
w.close
r.read_nonblock(1, exception: false) # => nil (EOF)

puts "=== sockets ===="
r, w = UNIXSocket.socketpair
r.read_nonblock(1, exception: false) # => :wait_readable
r.recvmsg_nonblock(1, exception: false) # => :wait_readable
r.recv_nonblock(1, exception: false) # => :wait_readable

w.close

r.read_nonblock(1, exception: false) # => nil (EOF)
r.recvmsg_nonblock(1, exception: false) # => ["", #<Addrinfo: empty-sockaddr SOCK_STREAM>, 128]]
r.recvmsg # => ["", #<Addrinfo: empty-sockaddr SOCK_STREAM>, 0]]
r.recv_nonblock(1, exception: false) # => ""
```

### Expected behavior

I would expect `recvmsg_nonblock`, `recvmsg`, `recv_nonblock` and `recv` to return `nil` when the connection is closed.





-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-12-17 19:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-20 13:52 [ruby-core:109961] [Ruby master Bug#19012] BasicSocket#recv* methods return an empty packet instead of nil on closed connections byroot (Jean Boussier)
2022-09-20 14:13 ` [ruby-core:109962] " byroot (Jean Boussier)
2022-09-21  8:02 ` [ruby-core:109972] " byroot (Jean Boussier)
2022-12-02  2:15 ` [ruby-core:111139] " mame (Yusuke Endoh)
2022-12-02 11:46 ` [ruby-core:111152] " byroot (Jean Boussier)
2022-12-02 11:52 ` [ruby-core:111153] " byroot (Jean Boussier)
2022-12-07  7:56 ` [ruby-core:111227] " byroot (Jean Boussier)
2023-12-17 19:52 ` [ruby-core:115768] " zverok (Victor Shepelev) via ruby-core

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).