Skip to content

Commit f35c80d

Browse files
Gareth AdamsGareth Adams
authored andcommitted
Correctly generate a zeroed FFI Buffer
1 parent ce4e768 commit f35c80d

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

lib/hid_api/device.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,23 @@ def get_serial_number_string
3030
end
3131

3232
def read(length)
33-
buffer = FFI::Buffer.new(1, length, true)
33+
buffer = clear_buffer length
3434
with_hid_error_handling do
3535
HidApi.hid_read self, buffer, buffer.length
3636
end
3737
buffer
3838
end
3939

4040
def read_timeout(length, timeout)
41-
buffer = FFI::Buffer.new(1, length, true)
41+
buffer = clear_buffer length
4242
with_hid_error_handling do
4343
HidApi.hid_read_timeout self, buffer, buffer.length, timeout
4444
end
4545
buffer
4646
end
4747

4848
def write(data)
49-
buffer = FFI::Buffer.new(1, data.length, true)
49+
buffer = clear_buffer data.length
5050
case data
5151
when String then buffer.put_bytes 0, data
5252
when Array then buffer.put_array_of_char 0, data
@@ -72,8 +72,15 @@ def error
7272
end
7373

7474
private
75+
def clear_buffer length
76+
b = FFI::Buffer.new(1, length)
77+
# FFI::Buffer doesn't clear the first byte if length < 8
78+
b.put_char 0, 0
79+
b
80+
end
81+
7582
def get_buffered_string field
76-
buffer = FFI::Buffer.new(1, 255, true)
83+
buffer = clear_buffer 255
7784
HidApi.send "hid_get_#{field}_string", self, buffer, buffer.length
7885
buffer.read_wchar_string
7986
end

0 commit comments

Comments
 (0)