src: network interface names are UTF-8 encoded
authorBen Noordhuis <info@bnoordhuis.nl>
Mon, 3 Nov 2014 15:42:07 +0000 (16:42 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Wed, 5 Nov 2014 19:39:24 +0000 (20:39 +0100)
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>
src/node_os.cc

index 53d3d21..9341ee6 100644 (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 {