The ASCII decoding for non ASCII character is incorrect if this character comes after...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Jan 2015 05:18:20 +0000 (05:18 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Jan 2015 05:18:20 +0000 (05:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140173.

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2015-01-07
Reviewed by Darin Adler.

Source/WebCore:

Tests: fast/encoding/char-after-fast-path-ascii-decoding.html.

* platform/text/TextCodecLatin1.cpp:
(WebCore::TextCodecLatin1::decode):
This function has a bug when it goes through the fast decoding code path. After copying
one or more all ASCII MachineWords from source to the destination, the following byte
is copied as is from the source to the destination even if it is non ASCII byte. This
causes the decoded bytes to be incorrect. The fix is to ensure that the current byte
is still ASCII after exiting the fast decoding code path.

LayoutTests:

* fast/encoding/char-after-fast-path-ascii-decoding-expected.txt: Added.
* fast/encoding/char-after-fast-path-ascii-decoding.html: Added.
Ensures when an non ASCII character comes after a machine word, whose bytes are all
ASCII characters, is decoded correctly.

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

LayoutTests/ChangeLog
LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding-expected.txt [new file with mode: 0644]
LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/text/TextCodecLatin1.cpp

index 17bb8c1..ec48fef 100644 (file)
@@ -1,3 +1,15 @@
+2015-01-07  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        The ASCII decoding for non ASCII character is incorrect if this character comes after going through the fast decoding code path and before the end of the text by less than a machine word size of characters.
+        https://bugs.webkit.org/show_bug.cgi?id=140173.
+
+        Reviewed by Darin Adler.
+
+        * fast/encoding/char-after-fast-path-ascii-decoding-expected.txt: Added.
+        * fast/encoding/char-after-fast-path-ascii-decoding.html: Added.
+        Ensures when an non ASCII character comes after a machine word, whose bytes are all
+        ASCII characters, is decoded correctly.
+
 2015-01-07  Shivakumar JM  <shiva.jm@samsung.com>
 
         HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument.
diff --git a/LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding-expected.txt b/LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding-expected.txt
new file mode 100644 (file)
index 0000000..ff91089
--- /dev/null
@@ -0,0 +1,2 @@
+
+ABCDEFGH‚‚
diff --git a/LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding.html b/LayoutTests/fast/encoding/char-after-fast-path-ascii-decoding.html
new file mode 100644 (file)
index 0000000..986515c
--- /dev/null
@@ -0,0 +1,23 @@
+<html>
+<body>
+  <iframe id="iframe" src="data:,%41%42%43%44%45%46%47%48%82%82"></iframe>
+  <p id="result"></p>
+  <script>
+    if (window.testRunner) {
+      testRunner.dumpAsText(false);
+      testRunner.waitUntilDone();
+    }
+
+    setTimeout(copyIframeText, 500);
+    
+    function copyIframeText()
+    {  
+      var iframe = document.getElementById("iframe");
+      var result = document.getElementById("result");
+      result.innerHTML = iframe.contentDocument.body.innerHTML;
+      if (window.testRunner)
+        testRunner.notifyDone();
+    }
+  </script>
+</body>
+</html>
\ No newline at end of file
index 0885d0a..571dd8e 100644 (file)
@@ -1,3 +1,20 @@
+2015-01-07  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        The ASCII decoding for non ASCII character is incorrect if this character comes after going through the fast decoding code path and before the end of the text by less than a machine word size of characters.
+        https://bugs.webkit.org/show_bug.cgi?id=140173.
+
+        Reviewed by Darin Adler.
+
+        Tests: fast/encoding/char-after-fast-path-ascii-decoding.html.
+
+        * platform/text/TextCodecLatin1.cpp:
+        (WebCore::TextCodecLatin1::decode):
+        This function has a bug when it goes through the fast decoding code path. After copying
+        one or more all ASCII MachineWords from source to the destination, the following byte
+        is copied as is from the source to the destination even if it is non ASCII byte. This
+        causes the decoded bytes to be incorrect. The fix is to ensure that the current byte
+        is still ASCII after exiting the fast decoding code path.
 2015-01-07  Shivakumar JM  <shiva.jm@samsung.com>
 
         HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument.
index 7a91002..3e44b83 100644 (file)
@@ -146,6 +146,10 @@ String TextCodecLatin1::decode(const char* bytes, size_t length, bool, bool, boo
 
                 if (source == end)
                     break;
+
+                // *source may not be ASCII anymore if source moves inside the loop of the fast code path
+                if (!isASCII(*source))
+                    goto useLookupTable;
             }
             *destination = *source;
         } else {
@@ -197,6 +201,10 @@ upConvertTo16Bit:
                 
                 if (source == end)
                     break;
+
+                // *source may not be ASCII anymore if source moves inside the loop of the fast code path
+                if (!isASCII(*source))
+                    goto useLookupTable16;
             }
             *destination16 = *source;
         } else {