Fixes a bug that was introduced in commit f674b09 when v8::String::New()
calls were replaced with calls to one-byte, two-byte and UTF-8 versions.
It turns out that for network interface names, using a one-byte encoding
can produce the wrong results on Windows. Use UTF-8 instead.
Libuv on Windows correctly encodes non-ASCII characters in the interface
name as UTF-8. On Unices however, the interface name is just a binary
string with no particular encoding; that's why on UNIX platforms, we
keep interpreting it as a one-byte string.
Fixes joyent/node#8633.
PR-URL: https://github.com/node-forward/node/pull/44
Reviewed-By: Bert Belder <bertbelder@gmail.com>
}
for (i = 0; i < count; i++) {
- name = OneByteString(env->isolate(), interfaces[i].name);
+ const char* const raw_name = interfaces[i].name;
+
+ // On Windows, the interface name is the UTF8-encoded friendly name and may
+ // contain non-ASCII characters. On UNIX, it's just a binary string with
+ // no particular encoding but we treat it as a one-byte Latin-1 string.
+#ifdef _WIN32
+ name = String::NewFromUtf8(env->isolate(), raw_name);
+#else
+ name = OneByteString(env->isolate(), raw_name);
+#endif
+
if (ret->Has(name)) {
ifarr = Local<Array>::Cast(ret->Get(name));
} else {