lib/facter/resolvers/windows/ffi/ffi.rb in facter-4.2.10 vs lib/facter/resolvers/windows/ffi/ffi.rb in facter-4.2.11
- old
+ new
@@ -22,29 +22,36 @@
ERROR_MORE_DATA = 234
MAX_PATH = 32_767
module FFI
WIN32FALSE = 0
- END_OF_WCHAR_STRING = "\0\0".encode('UTF-16LE')
+ END_OF_WCHAR_STRING = (+"\0\0").force_encoding(Encoding::UTF_16LE).freeze
class Pointer
def read_wide_string_with_length(char_length)
# char_length is number of wide chars (typically excluding NULLs), *not* bytes
- str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
- str.encode('UTF-8', str.encoding)
+ str = get_bytes(0, char_length * 2).force_encoding(Encoding::UTF_16LE)
+ str.encode(Encoding::UTF_8, str.encoding)
end
- def read_wide_string_without_length
+ def read_wide_string_without_length(replace_invalid_chars: false)
wide_character = get_bytes(0, 2)
+ wide_character.force_encoding(Encoding::UTF_16LE)
i = 2
str = []
- while wide_character.encode('UTF-16LE') != END_OF_WCHAR_STRING
+ while wide_character != END_OF_WCHAR_STRING
str << wide_character
wide_character = get_bytes(i, 2)
+ wide_character.force_encoding(Encoding::UTF_16LE)
i += 2
end
- str.join.force_encoding('UTF-16LE').encode('UTF-8')
+
+ if replace_invalid_chars
+ str.join.force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace)
+ else
+ str.join.force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8)
+ end
end
def read_win32_bool
# BOOL is always a 32-bit integer in Win32
# some Win32 APIs return 1 for true, while others are non-0