Skip to content

Commit 2465104

Browse files
committed
[GR-16455] Fix argument checks in BasicSocket#setsockopt.
PullRequest: truffleruby/893
2 parents 5defdc8 + e5f84cf commit 2465104

File tree

4 files changed

+17
-22
lines changed

4 files changed

+17
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Bug fixes:
77
* Removed extra `public` methods on `IO` (#1702).
88
* Fixed `Process.kill(signal, Process.pid)` when the signal is trapped as `:IGNORE` (#1702).
99
* Fixed `Addrinfo.new(String)` to reliably find the address family (#1702).
10+
* Fixed argument checks in `BasicSocket#setsockopt` (#1460).
1011

1112
Compatibility:
1213

lib/truffle/socket/basic_socket.rb

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,34 +64,29 @@ def getsockopt(level, optname)
6464
Socket::Option.new(family, level, optname, data)
6565
end
6666

67-
def setsockopt(level_or_option, optname = nil, optval = nil)
68-
if level_or_option and optname and optval
69-
if level_or_option.is_a?(Socket::Option)
70-
raise TypeError,
71-
'expected the first argument to be a Integer, Symbol, or String'
72-
end
73-
74-
level = level_or_option
75-
elsif level_or_option.is_a?(Socket::Option)
76-
raise(ArgumentError, 'given 2, expected 1') if optname
77-
78-
level = level_or_option.level
79-
optname = level_or_option.optname
80-
optval = level_or_option.data
67+
def setsockopt(*args)
68+
if args.size == 1
69+
option = args[0]
70+
level = option.level
71+
optname = option.optname
72+
optval = option.data
73+
elsif args.size == 3
74+
level, optname, optval = args
8175
else
82-
raise TypeError,
83-
'expected the first argument to be a Integer, Symbol, String, or Socket::Option'
76+
Truffle::Type.check_arity(args.size, 3, 3)
8477
end
8578

86-
optval = 1 if optval == true
87-
optval = 0 if optval == false
88-
8979
sockname = Truffle::Socket::Foreign.getsockname(@descriptor)
9080
family = Truffle::Socket.family_for_sockaddr_in(sockname)
9181
level = Truffle::Socket::SocketOptions.socket_level(level, family)
9282
optname = Truffle::Socket::SocketOptions.socket_option(level, optname)
9383
error = 0
9484

85+
case optval
86+
when true then optval = 1
87+
when false then optval = 0
88+
end
89+
9590
if optval.is_a?(Integer)
9691
Truffle::Socket::Foreign.memory_pointer(:socklen_t) do |pointer|
9792
pointer.write_int(optval)

lib/truffle/socket/truffle/socket_options.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def self.socket_level(level, family = nil)
4343
elsif level.respond_to?(:to_str)
4444
socket_level(Socket.coerce_to_string(level), family)
4545
else
46-
level
46+
Truffle::Type.coerce_to_int level
4747
end
4848
end
4949

@@ -73,7 +73,7 @@ def self.socket_option(level, optname)
7373
if optname.respond_to?(:to_str)
7474
socket_option(level, Socket.coerce_to_string(optname))
7575
else
76-
optname
76+
Truffle::Type.coerce_to_int optname
7777
end
7878
end
7979
end

spec/tags/library/socket/basicsocket/setsockopt_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)