From e13663d647d036d49872b7ab99a5fb7b9d9268df Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 3 Nov 2014 16:42:07 +0100 Subject: [PATCH] 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 --- src/node_os.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/node_os.cc b/src/node_os.cc index 53d3d21e56f..9341ee67e69 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -231,7 +231,17 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& 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::Cast(ret->Get(name)); } else {