[WK2][X11] NetscapePluginModule::scanPlugin() should write UTF-8 strings to stdout
authorzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Apr 2014 14:27:14 +0000 (14:27 +0000)
committerzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Apr 2014 14:27:14 +0000 (14:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=132245

Reviewed by Carlos Garcia Campos.

NetscapePluginModule::scanPlugin(), in the helper writeLine function, takes each character
of the given string and writes it out as a UChar, doing two fputc calls for each byte of the
16-bit type.

This fails badly with characters with integer value less than 256 as the most significant byte
of the UChar is written out as a null character. This effectively chops the output that's gathered
in the UIProcess and is parsed in PluginProcessProxy::scanPlugin().

To avoid all this, the UTF-8 encoding of the string is written out in the PluginProcess, and
String::fromUTF8() is called in the UIProcess to properly decode the received string.

* Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
(WebKit::writeCharacter):
(WebKit::writeLine):
(WebKit::writeByte): Deleted.
* UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp:
(WebKit::PluginProcessProxy::scanPlugin):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@167885 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp

index 7f27de9..c0ca314 100644 (file)
@@ -1,5 +1,30 @@
 2014-04-28  Zan Dobersek  <zdobersek@igalia.com>
 
+        [WK2][X11] NetscapePluginModule::scanPlugin() should write UTF-8 strings to stdout
+        https://bugs.webkit.org/show_bug.cgi?id=132245
+
+        Reviewed by Carlos Garcia Campos.
+
+        NetscapePluginModule::scanPlugin(), in the helper writeLine function, takes each character
+        of the given string and writes it out as a UChar, doing two fputc calls for each byte of the
+        16-bit type.
+
+        This fails badly with characters with integer value less than 256 as the most significant byte
+        of the UChar is written out as a null character. This effectively chops the output that's gathered
+        in the UIProcess and is parsed in PluginProcessProxy::scanPlugin().
+
+        To avoid all this, the UTF-8 encoding of the string is written out in the PluginProcess, and
+        String::fromUTF8() is called in the UIProcess to properly decode the received string.
+
+        * Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
+        (WebKit::writeCharacter):
+        (WebKit::writeLine):
+        (WebKit::writeByte): Deleted.
+        * UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp:
+        (WebKit::PluginProcessProxy::scanPlugin):
+
+2014-04-28  Zan Dobersek  <zdobersek@igalia.com>
+
         [GTK][WK2] Missing return statement in webkit_plugin_get_description()
         https://bugs.webkit.org/show_bug.cgi?id=132263
 
index f6a548b..7e880ac 100644 (file)
@@ -195,24 +195,20 @@ void NetscapePluginModule::determineQuirks()
     }
 }
 
-static void writeByte(char byte)
+static void writeCharacter(char byte)
 {
     int result;
     while ((result = fputc(byte, stdout)) == EOF && errno == EINTR) { }
     ASSERT(result != EOF);
 }
 
-static void writeCharacter(UChar character)
-{
-    writeByte(reinterpret_cast<const char*>(&character)[0]);
-    writeByte(reinterpret_cast<const char*>(&character)[1]);
-}
-
 static void writeLine(const String& line)
 {
-    unsigned length = line.length();
-    for (unsigned i = 0; i < length; ++i) {
-        UChar character = line[i];
+    CString utf8String = line.utf8();
+    const char* utf8Data = utf8String.data();
+
+    for (unsigned i = 0; i < utf8String.length(); i++) {
+        char character = utf8Data[i];
         if (character != '\n')
             writeCharacter(character);
     }
index 91ec00c..538dd79 100644 (file)
@@ -100,7 +100,7 @@ bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData&
     if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS || !stdOut)
         return false;
 
-    String stdOutString(reinterpret_cast<const UChar*>(stdOut.get()));
+    String stdOutString = String::fromUTF8(stdOut.get());
 
     Vector<String> lines;
     stdOutString.split(UChar('\n'), true, lines);