Skip to content

Commit 87e6317

Browse files
committed
[GR-16115] Fix TCPServer#accept to set #do_not_reverse_lookup correctly on the created TCPSocket.
PullRequest: truffleruby/867
2 parents fbab3ba + 865c8a3 commit 87e6317

File tree

7 files changed

+73
-9
lines changed

7 files changed

+73
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Bug fixes:
1515
* Procs will now yield to the block in their declaration context even when called with a block argument (#1657).
1616
* Fixed problems with calling POSIX methods if `Symbol#[]` is redefined (#1665).
1717
* Fixed sharing of `Array` and `Hash` elements for thread-safety of objects (#1601).
18+
* Fix `TCPServer#accept` to set `#do_not_reverse_lookup` correctly on the created `TCPSocket`.
1819

1920
Compatibility
2021

lib/truffle/socket/basic_socket.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

2727
class BasicSocket < IO
28-
def self.for_fd(fixnum)
28+
def self.for_fd(fd)
2929
sock = allocate
3030

31-
IO.setup(sock, fixnum, nil, true)
31+
IO.setup(sock, fd, nil, true)
3232
sock.binmode
3333
# TruffleRuby: start
3434
sock.do_not_reverse_lookup = do_not_reverse_lookup

lib/truffle/socket/truffle.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,7 @@ def self.accept(source, new_class)
8181

8282
Error.read_error('accept(2)', source) if fd < 0
8383

84-
socket = new_class.allocate
85-
86-
::IO.setup(socket, fd, nil, true)
87-
socket.binmode
84+
socket = new_class.for_fd(fd)
8885

8986
socktype = source.getsockopt(:SOCKET, :TYPE).int
9087
addrinfo = Addrinfo.new(sockaddr.to_s, sockaddr.family, socktype)

lib/truffle/socket/truffle/foreign.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ def self.getnameinfo(sockaddr, flags = ::Socket::NI_NUMERICHOST | ::Socket::NI_N
208208

209209
raise SocketError, gai_strerror(err) unless err == 0
210210

211-
sa_family = SockaddrIn.with_sockaddr(sockaddr)[:sin_family]
211+
sa_family = SockaddrIn.new(sockaddr_p)[:sin_family]
212212

213213
name_info[0] = ::Socket::Constants::AF_TO_FAMILY[sa_family]
214214
name_info[1] = service.read_string

spec/ruby/CONTRIBUTING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ variables from the implementor spec: `@method` and `@object`, which the implemen
188188

189189
Here's an example of a snippet of a shared spec and two specs which integrates it:
190190

191-
``` ruby
191+
```ruby
192192
# core/hash/shared/key.rb
193193
describe :hash_key_p, shared: true do
194194
it "returns true if the key's matching value was false" do
@@ -216,7 +216,7 @@ Sometimes, shared specs require more context from the implementor class than a s
216216
this by passing a lambda as the method, which will have the scope of the implementor. Here's an example of
217217
how this is used currently:
218218

219-
``` ruby
219+
```ruby
220220
describe :kernel_sprintf, shared: true do
221221
it "raises TypeError exception if cannot convert to Integer" do
222222
-> { @method.call("%b", Object.new) }.should raise_error(TypeError)

spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,67 @@
3737
@socket.peeraddr[2].should == "127.0.0.1"
3838
end
3939
end
40+
41+
describe :socket_do_not_reverse_lookup, shared: true do
42+
it "inherits from BasicSocket.do_not_reverse_lookup when the socket is created" do
43+
@socket = @method.call
44+
reverse = BasicSocket.do_not_reverse_lookup
45+
@socket.do_not_reverse_lookup.should == reverse
46+
47+
BasicSocket.do_not_reverse_lookup = !reverse
48+
@socket.do_not_reverse_lookup.should == reverse
49+
end
50+
51+
it "is true when BasicSocket.do_not_reverse_lookup is true" do
52+
BasicSocket.do_not_reverse_lookup = true
53+
@socket = @method.call
54+
@socket.do_not_reverse_lookup.should == true
55+
end
56+
57+
it "is false when BasicSocket.do_not_reverse_lookup is false" do
58+
BasicSocket.do_not_reverse_lookup = false
59+
@socket = @method.call
60+
@socket.do_not_reverse_lookup.should == false
61+
end
62+
63+
it "can be changed with #do_not_reverse_lookup=" do
64+
@socket = @method.call
65+
reverse = @socket.do_not_reverse_lookup
66+
@socket.do_not_reverse_lookup = !reverse
67+
@socket.do_not_reverse_lookup.should == !reverse
68+
end
69+
end
70+
71+
describe "BasicSocket#do_not_reverse_lookup" do
72+
before :each do
73+
@do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup
74+
@server = TCPServer.new('127.0.0.1', 0)
75+
@port = @server.addr[1]
76+
end
77+
78+
after :each do
79+
@server.close unless @server.closed?
80+
@socket.close if @socket && !@socket.closed?
81+
BasicSocket.do_not_reverse_lookup = @do_not_reverse_lookup
82+
end
83+
84+
describe "for an TCPSocket.new socket" do
85+
it_behaves_like :socket_do_not_reverse_lookup, -> {
86+
TCPSocket.new('127.0.0.1', @port)
87+
}
88+
end
89+
90+
describe "for an TCPServer#accept socket" do
91+
before :each do
92+
@client = TCPSocket.new('127.0.0.1', @port)
93+
end
94+
95+
after :each do
96+
@client.close if @client && !@client.closed?
97+
end
98+
99+
it_behaves_like :socket_do_not_reverse_lookup, -> {
100+
@server.accept
101+
}
102+
end
103+
end
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
fails:BasicSocket#do_not_reverse_lookup for an TCPSocket.new socket is false when BasicSocket.do_not_reverse_lookup is false
2+
fails:BasicSocket#do_not_reverse_lookup for an TCPServer#accept socket is false when BasicSocket.do_not_reverse_lookup is false

0 commit comments

Comments
 (0)