Skip to content

Commit e5f84cf

Browse files
committed
Fix argument checks in BasicSocket#setsockopt
1 parent effd2cf commit e5f84cf

File tree

3 files changed

+15
-20
lines changed

3 files changed

+15
-20
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)

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

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

0 commit comments

Comments
 (0)