src: network interface names are UTF-8 encoded

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>
pull/1/head
Ben Noordhuis 2014-11-03 16:42:07 +01:00
parent 7ab73ff735
commit e13663d647
1 changed files with 11 additions and 1 deletions

View File

@ -231,7 +231,17 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
}
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 {