Skip to content

Commit 15763c3

Browse files
committed
[GR-8904] Check bounds for FFI::Pointer accesses
PullRequest: truffleruby/2004
2 parents 6105b1e + c9e701a commit 15763c3

File tree

21 files changed

+143
-38
lines changed

21 files changed

+143
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Compatibility:
3838
* Pass the final `super` specs (#2104, @chrisseaton).
3939
* Fix arity for arguments with optional kwargs (#1669, @ssnickolay)
4040
* Fix arity for `Proc` (#2098, @ssnickolay)
41+
* Check bounds for `FFI::Pointer` accesses when the size of the memory behind is known.
4142

4243
Performance:
4344

bench/optcarrot/lib/optcarrot/driver/misc.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def icon_data
105105
end
106106
dat = dat.bytes.map {|clr| palette[clr - 35] }
107107

108-
return width, height, pixels.write_string(dat.pack("V*"))
108+
return width, height, pixels.write_bytes(dat.pack("V*"))
109109
end
110110
end
111111
end

lib/truffle/socket/basic_socket.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def setsockopt(*args)
9898
end
9999
elsif optval.is_a?(String)
100100
Truffle::Socket::Foreign.memory_pointer(optval.bytesize) do |pointer|
101-
pointer.write_string(optval)
101+
pointer.write_bytes(optval)
102102

103103
error = Truffle::Socket::Foreign
104104
.setsockopt(Primitive.io_fd(self), level, optname, pointer, optval.bytesize)
@@ -129,7 +129,7 @@ def send(message, flags, dest_sockaddr = nil)
129129
end
130130

131131
Truffle::Socket::Foreign.char_pointer(bytes) do |buffer|
132-
buffer.write_string(message)
132+
buffer.write_bytes(message)
133133

134134
if dest_sockaddr.is_a?(String)
135135
addr = Truffle::Socket.sockaddr_class_for_socket(self)
@@ -258,7 +258,7 @@ def recvmsg_nonblock(max_msg_len = nil, flags = 0, max_control_len = nil, except
258258
address = nil
259259

260260
begin
261-
msg_buffer.write_string(message)
261+
msg_buffer.write_bytes(message)
262262

263263
header.message = io_vec
264264

lib/truffle/socket/socket.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def self.gethostbyaddr(addr, family = nil)
165165
family = Truffle::Socket.address_family(family)
166166

167167
Truffle::Socket::Foreign.char_pointer(addr.bytesize) do |in_pointer|
168-
in_pointer.write_string(addr)
168+
in_pointer.write_bytes(addr)
169169

170170
out_pointer = Truffle::Socket::Foreign
171171
.gethostbyaddr(in_pointer, in_pointer.total, family)

lib/truffle/socket/truffle/foreign.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ module Foreign
9797
def self.bind(descriptor, sockaddr)
9898
sockaddr_p = Truffle::FFI::Pool.stack_alloc(:char, sockaddr.bytesize)
9999
begin
100-
sockaddr_p.write_string(sockaddr, sockaddr.bytesize)
100+
sockaddr_p.write_bytes(sockaddr)
101101
_bind(descriptor, sockaddr_p, sockaddr.bytesize)
102102
ensure
103103
Truffle::FFI::Pool.stack_free(sockaddr_p)
@@ -110,7 +110,7 @@ def self.connect(descriptor, sockaddr)
110110
sockaddr_p = Truffle::FFI::Pool.stack_alloc(:char, sockaddr.bytesize)
111111

112112
begin
113-
sockaddr_p.write_string(sockaddr, sockaddr.bytesize)
113+
sockaddr_p.write_bytes(sockaddr)
114114

115115
_connect(descriptor, sockaddr_p, sockaddr.bytesize)
116116
ensure
@@ -201,7 +201,7 @@ def self.getnameinfo(sockaddr, flags = ::Socket::NI_NUMERICHOST | ::Socket::NI_N
201201
:char, sockaddr.bytesize, :char, ::Socket::NI_MAXHOST, :char, ::Socket::NI_MAXSERV)
202202

203203
begin
204-
sockaddr_p.write_string(sockaddr, sockaddr.bytesize)
204+
sockaddr_p.write_bytes(sockaddr)
205205

206206
if reverse_lookup
207207
err = _getnameinfo(sockaddr_p, sockaddr.bytesize, node,

lib/truffle/socket/truffle/foreign/linger.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Linger < ::FFI::Struct
3333
def self.from_string(string)
3434
linger = new
3535

36-
linger.pointer.write_string(string, string.bytesize)
36+
linger.pointer.write_bytes(string)
3737

3838
linger
3939
end

lib/truffle/socket/truffle/foreign/sockaddr_in.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SockaddrIn < ::FFI::Struct
3333

3434
def self.with_sockaddr(addr)
3535
pointer = Foreign.memory_pointer(addr.bytesize)
36-
pointer.write_string(addr, addr.bytesize)
36+
pointer.write_bytes(addr)
3737

3838
new(pointer)
3939
end

lib/truffle/socket/truffle/foreign/sockaddr_in6.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SockaddrIn6 < ::FFI::Struct
3333

3434
def self.with_sockaddr(addr)
3535
pointer = Foreign.memory_pointer(addr.bytesize)
36-
pointer.write_string(addr, addr.bytesize)
36+
pointer.write_bytes(addr)
3737

3838
new(pointer)
3939
end

lib/truffle/socket/truffle/foreign/sockaddr_un.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def self.with_sockaddr(addr)
3737
end
3838

3939
pointer = Foreign.memory_pointer(size)
40-
pointer.write_string(addr, addr.bytesize)
40+
pointer.write_bytes(addr)
4141

4242
new(pointer)
4343
end

spec/ffi/pointer_spec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ def to_ptr
155155
end
156156

157157
it "access beyond bounds should raise IndexError" do
158-
skip "not yet supported on TruffleRuby" if RUBY_ENGINE == "truffleruby"
159158
expect { @mptr.slice(4, 4).get_int(4) }.to raise_error(IndexError)
160159
end
161160
end

0 commit comments

Comments
 (0)