Title: [252847] trunk
Revision
252847
Author
[email protected]
Date
2019-11-25 00:50:13 -0800 (Mon, 25 Nov 2019)

Log Message

REGRESSION (Safari 13): WebSocket payload is truncated when x-webkit-deflate-frame is used
https://bugs.webkit.org/show_bug.cgi?id=202401
<rdar://problem/55922632>

Reviewed by Alex Christensen.

Source/WebCore:

Test: http/tests/websocket/tests/hybi/deflate-extension.html

* Modules/websockets/WebSocketDeflater.cpp:
(WebCore::WebSocketDeflater::finish):
Make sure to continue calling deflate until all output data is flushed.

LayoutTests:

* http/tests/websocket/tests/hybi/deflate-extension-expected.txt: Added.
* http/tests/websocket/tests/hybi/deflate-extension.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (252846 => 252847)


--- trunk/LayoutTests/ChangeLog	2019-11-25 08:47:45 UTC (rev 252846)
+++ trunk/LayoutTests/ChangeLog	2019-11-25 08:50:13 UTC (rev 252847)
@@ -1,3 +1,14 @@
+2019-11-25  Youenn Fablet  <[email protected]>
+
+        REGRESSION (Safari 13): WebSocket payload is truncated when x-webkit-deflate-frame is used
+        https://bugs.webkit.org/show_bug.cgi?id=202401
+        <rdar://problem/55922632>
+
+        Reviewed by Alex Christensen.
+
+        * http/tests/websocket/tests/hybi/deflate-extension-expected.txt: Added.
+        * http/tests/websocket/tests/hybi/deflate-extension.html: Added.
+
 2019-11-25  youenn fablet  <[email protected]>
 
         Mark imported/w3c/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html as Slow

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt (0 => 252847)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt	2019-11-25 08:50:13 UTC (rev 252847)
@@ -0,0 +1,13 @@
+Test WebSocket deflate-frame extension.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+PASS event.data is thirdMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html (0 => 252847)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html	2019-11-25 08:50:13 UTC (rev 252847)
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+description("Test WebSocket deflate-frame extension.");
+
+window.jsTestIsAsync = true;
+
+var closeEvent;
+var ws;
+var messageIndex;
+
+function randomText(len) {
+    const allCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+    var randomText = ''
+    for (var i = 0; i < len; i++) {
+        var k = Math.floor(Math.random() * allCharacters.length)
+        randomText += allCharacters.charAt(k);
+    }
+    return randomText
+}
+
+var firstMessage = randomText(10000);
+var secondMessage = randomText(10000);
+var thirdMessage = randomText(10000);
+
+function doTest(queryIndex)
+{
+    var url = ""
+    ws = new WebSocket(url);
+    messageIndex = 0;
+
+    ws._onopen_ = function(event)
+    {
+        ws.send(firstMessage);
+    };
+
+    ws._onmessage_ = function(event)
+    {
+        if (messageIndex === 0) {
+            shouldBe("event.data", "firstMessage");
+            messageIndex += 1
+            ws.send(secondMessage);
+        } else if (messageIndex === 1) {
+            shouldBe("event.data", "secondMessage");
+            messageIndex += 1
+            ws.send(thirdMessage);
+        } else {
+            shouldBe("event.data", "thirdMessage");
+            ws.close();
+        }
+    };
+
+    ws._onclose_ = function(event)
+    {
+        debug("onclose() was called.");
+        closeEvent = event;
+        shouldBeTrue("closeEvent.wasClean");
+        finishJSTest();
+    };
+}
+
+doTest(0);
+
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (252846 => 252847)


--- trunk/Source/WebCore/ChangeLog	2019-11-25 08:47:45 UTC (rev 252846)
+++ trunk/Source/WebCore/ChangeLog	2019-11-25 08:50:13 UTC (rev 252847)
@@ -1,3 +1,17 @@
+2019-11-25  Youenn Fablet  <[email protected]>
+
+        REGRESSION (Safari 13): WebSocket payload is truncated when x-webkit-deflate-frame is used
+        https://bugs.webkit.org/show_bug.cgi?id=202401
+        <rdar://problem/55922632>
+
+        Reviewed by Alex Christensen.
+
+        Test: http/tests/websocket/tests/hybi/deflate-extension.html
+
+        * Modules/websockets/WebSocketDeflater.cpp:
+        (WebCore::WebSocketDeflater::finish):
+        Make sure to continue calling deflate until all output data is flushed.
+
 2019-11-24  Sunny He  <[email protected]>
 
         Ensure SpeechSynthesis::cancel() correctly clears m_currentSpeechUtterance

Modified: trunk/Source/WebCore/Modules/websockets/WebSocketDeflater.cpp (252846 => 252847)


--- trunk/Source/WebCore/Modules/websockets/WebSocketDeflater.cpp	2019-11-25 08:47:45 UTC (rev 252846)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketDeflater.cpp	2019-11-25 08:50:13 UTC (rev 252847)
@@ -101,11 +101,13 @@
         size_t availableCapacity = m_buffer.size() - writePosition;
         setStreamParameter(m_stream.get(), 0, 0, m_buffer.data() + writePosition, availableCapacity);
         int result = deflate(m_stream.get(), Z_SYNC_FLUSH);
-        m_buffer.shrink(writePosition + availableCapacity - m_stream->avail_out);
-        if (result == Z_OK)
-            break;
-        if (result != Z_BUF_ERROR)
-            return false;
+        if (m_stream->avail_out) {
+            m_buffer.shrink(writePosition + availableCapacity - m_stream->avail_out);
+            if (result == Z_OK)
+                break;
+            if (result != Z_BUF_ERROR)
+                return false;
+        }
     }
     // Remove 4 octets from the tail as the specification requires.
     if (m_buffer.size() <= 4)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to