WebSocketServer: Honour WebSocketFrame::masked in makeFrameData
authorjocelyn.turcotte@nokia.com <jocelyn.turcotte@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Apr 2012 15:31:10 +0000 (15:31 +0000)
committerjocelyn.turcotte@nokia.com <jocelyn.turcotte@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Apr 2012 15:31:10 +0000 (15:31 +0000)
https://bugs.webkit.org/show_bug.cgi?id=83042

Reviewed by Kent Tamura.

Frames from the server should not be masked.
Currently, the flag is set to false, but the frames were masked anyway.
This causes clients with recent builds of WebKit to abort the connection to the
inspector server, refusing masked frames from the server as per the spec.
This doesn't change the behavior of WebSocket clients, which set the masked flag to true.

* Modules/websockets/WebSocketFrame.cpp:
(WebCore::appendFramePayload):
(WebCore::WebSocketFrame::makeFrameData):

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

Source/WebCore/ChangeLog
Source/WebCore/Modules/websockets/WebSocketFrame.cpp

index 7a03186..7923f86 100644 (file)
@@ -1,3 +1,20 @@
+2012-04-03  Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
+
+        WebSocketServer: Honour WebSocketFrame::masked in makeFrameData
+        https://bugs.webkit.org/show_bug.cgi?id=83042
+
+        Reviewed by Kent Tamura.
+
+        Frames from the server should not be masked.
+        Currently, the flag is set to false, but the frames were masked anyway.
+        This causes clients with recent builds of WebKit to abort the connection to the
+        inspector server, refusing masked frames from the server as per the spec.
+        This doesn't change the behavior of WebSocket clients, which set the masked flag to true.
+
+        * Modules/websockets/WebSocketFrame.cpp:
+        (WebCore::appendFramePayload):
+        (WebCore::WebSocketFrame::makeFrameData):
+
 2012-04-09  Alexis Menard  <alexis.menard@openbossa.org>
 
         [Part 5] We should use CSSPropertyID rather than integers when manipulating CSS property ids.
index 1211cb9..fa6f384 100644 (file)
@@ -129,34 +129,40 @@ WebSocketFrame::ParseFrameResult WebSocketFrame::parseFrame(char* data, size_t d
     return FrameOK;
 }
 
-static void appendMaskedFramePayload(const WebSocketFrame& frame, Vector<char>& frameData)
+static void appendFramePayload(const WebSocketFrame& frame, Vector<char>& frameData)
 {
-    size_t maskingKeyStart = frameData.size();
-    frameData.grow(frameData.size() + maskingKeyWidthInBytes); // Add placeholder for masking key. Will be overwritten.
+    size_t maskingKeyStart = 0;
+    if (frame.masked) {
+        maskingKeyStart = frameData.size();
+        frameData.grow(frameData.size() + maskingKeyWidthInBytes); // Add placeholder for masking key. Will be overwritten.
+    }
+
     size_t payloadStart = frameData.size();
     frameData.append(frame.payload, frame.payloadLength);
 
-    cryptographicallyRandomValues(frameData.data() + maskingKeyStart, maskingKeyWidthInBytes);
-    for (size_t i = 0; i < frame.payloadLength; ++i)
-        frameData[payloadStart + i] ^= frameData[maskingKeyStart + i % maskingKeyWidthInBytes];
+    if (frame.masked) {
+        cryptographicallyRandomValues(frameData.data() + maskingKeyStart, maskingKeyWidthInBytes);
+        for (size_t i = 0; i < frame.payloadLength; ++i)
+            frameData[payloadStart + i] ^= frameData[maskingKeyStart + i % maskingKeyWidthInBytes];
+    }
 }
 
 void WebSocketFrame::makeFrameData(Vector<char>& frameData)
 {
     ASSERT(!(opCode & ~opCodeMask)); // Checks whether "opCode" fits in the range of opCodes.
 
-    unsigned char firstByte = (final ? finalBit : 0) | opCode;
-    if (compress)
-        firstByte |= compressBit;
-    frameData.append(firstByte);
+    frameData.resize(2);
+    frameData.at(0) = (final ? finalBit : 0) | (compress ? compressBit : 0) | opCode;
+    frameData.at(1) = masked ? maskBit : 0;
+
     if (payloadLength <= maxPayloadLengthWithoutExtendedLengthField)
-        frameData.append(maskBit | payloadLength);
+        frameData.at(1) |= payloadLength;
     else if (payloadLength <= 0xFFFF) {
-        frameData.append(maskBit | payloadLengthWithTwoByteExtendedLengthField);
+        frameData.at(1) |= payloadLengthWithTwoByteExtendedLengthField;
         frameData.append((payloadLength & 0xFF00) >> 8);
         frameData.append(payloadLength & 0xFF);
     } else {
-        frameData.append(maskBit | payloadLengthWithEightByteExtendedLengthField);
+        frameData.at(1) |= payloadLengthWithEightByteExtendedLengthField;
         char extendedPayloadLength[8];
         size_t remaining = payloadLength;
         // Fill the length into extendedPayloadLength in the network byte order.
@@ -168,7 +174,7 @@ void WebSocketFrame::makeFrameData(Vector<char>& frameData)
         frameData.append(extendedPayloadLength, 8);
     }
 
-    appendMaskedFramePayload(*this, frameData);
+    appendFramePayload(*this, frameData);
 }
 
 WebSocketFrame::WebSocketFrame(OpCode opCode, bool final, bool compress, bool masked, const char* payload, size_t payloadLength)