Project

General

Profile

Actions

Bug #21702

open

`UNIXSocket` on Windows: suprising results in `#recvfrom` and `#remote_address`

Bug #21702: `UNIXSocket` on Windows: suprising results in `#recvfrom` and `#remote_address`

Added by trinistr (Alexander Bulancov) about 11 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:123878]

Description

Support for UNIXSocket on Windows was added in #19135. Through testing in ruby/spec, I identified unexpected results in two methods:

  1. #remote_address.to_s always returns 110 bytes, compared to #local_address.to_s which returns only needed bytes. Example:
    # test (@addr is remote_address, @b is the socket created with UNIXServer#accept):
    @addr.to_s.should == @b.local_address.to_s
    # failure:
    "\x01\x00D:/a/spec/spec/rubyspec_temp/2032_3/unix.sock\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" == "\x01\x00D:/a/spec/spec/rubyspec_temp/2032_3/unix.sock\x00"
    
    Note how the address is correct, and #unix_paths are indeed equal, but there are NUL bytes filling the string representation up to 110 bytes. This number does not depend on the length of path name.
  2. Much more worryingly, UNIXSocket#recvfrom dumps 2047 bytes of memory as the remote address:
    # test:
    @server.recvfrom(5).should == ['hello', ['AF_UNIX', '']]
    # failure:
    ["hello",["AF_UNIX","\x14\xB3v\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\xAB\xCD\x12C\xFF\x7F<snip>"]] == ["hello", ["AF_UNIX", ""]]
    
    This seems to be a result of union_sockaddr having a char place_holder[2048] member inside, though it isn't clear why is this used instead of sockaddr_un member.

These results are obtained from GitHub runners, as I don't have a machine to test directly. This is the PR in ruby/spec which brought this up: https://github.com/ruby/spec/pull/1300.

No data to display

Actions

Also available in: PDF Atom