Check if the received frame is correctly masked or not
This commit is contained in:
		@@ -648,7 +648,19 @@ namespace WebSocketSharp
 | 
			
		||||
    private bool concatenateFragmentsInto (Stream destination)
 | 
			
		||||
    {
 | 
			
		||||
      while (true) {
 | 
			
		||||
        var frame = WebSocketFrame.Read (_stream, true);
 | 
			
		||||
        var frame = WebSocketFrame.Read (_stream, false);
 | 
			
		||||
        var masked = frame.IsMasked;
 | 
			
		||||
        if (_client && masked)
 | 
			
		||||
          return processUnsupportedFrame (
 | 
			
		||||
            frame, CloseStatusCode.ProtocolError, "A frame from the server is masked.");
 | 
			
		||||
 | 
			
		||||
        if (!_client && !masked)
 | 
			
		||||
          return processUnsupportedFrame (
 | 
			
		||||
            frame, CloseStatusCode.ProtocolError, "A frame from a client isn't masked.");
 | 
			
		||||
 | 
			
		||||
        if (masked)
 | 
			
		||||
          frame.Unmask ();
 | 
			
		||||
 | 
			
		||||
        if (frame.IsFinal) {
 | 
			
		||||
          /* FINAL */
 | 
			
		||||
 | 
			
		||||
@@ -1002,6 +1014,18 @@ namespace WebSocketSharp
 | 
			
		||||
 | 
			
		||||
    private bool processWebSocketFrame (WebSocketFrame frame)
 | 
			
		||||
    {
 | 
			
		||||
      var masked = frame.IsMasked;
 | 
			
		||||
      if (_client && masked)
 | 
			
		||||
        return processUnsupportedFrame (
 | 
			
		||||
          frame, CloseStatusCode.ProtocolError, "A frame from the server is masked.");
 | 
			
		||||
 | 
			
		||||
      if (!_client && !masked)
 | 
			
		||||
        return processUnsupportedFrame (
 | 
			
		||||
          frame, CloseStatusCode.ProtocolError, "A frame from a client isn't masked.");
 | 
			
		||||
 | 
			
		||||
      if (masked)
 | 
			
		||||
        frame.Unmask ();
 | 
			
		||||
 | 
			
		||||
      return frame.IsCompressed && _compression == CompressionMethod.None
 | 
			
		||||
             ? processUnsupportedFrame (
 | 
			
		||||
                 frame,
 | 
			
		||||
@@ -1285,7 +1309,7 @@ namespace WebSocketSharp
 | 
			
		||||
      Action receive = null;
 | 
			
		||||
      receive = () => WebSocketFrame.ReadAsync (
 | 
			
		||||
        _stream,
 | 
			
		||||
        true,
 | 
			
		||||
        false,
 | 
			
		||||
        frame => {
 | 
			
		||||
          if (processWebSocketFrame (frame) && _readyState != WebSocketState.Closed) {
 | 
			
		||||
            receive ();
 | 
			
		||||
 
 | 
			
		||||
@@ -516,14 +516,10 @@ Extended Payload Length: {7}
 | 
			
		||||
        data = new byte[0];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var payload = new PayloadData (data, masked);
 | 
			
		||||
      if (masked && unmask) {
 | 
			
		||||
        payload.Mask (maskingKey);
 | 
			
		||||
        frame._mask = Mask.Unmask;
 | 
			
		||||
        frame._maskingKey = new byte[0];
 | 
			
		||||
      }
 | 
			
		||||
      frame._payloadData = new PayloadData (data, masked);
 | 
			
		||||
      if (unmask && masked)
 | 
			
		||||
        frame.Unmask ();
 | 
			
		||||
 | 
			
		||||
      frame._payloadData = payload;
 | 
			
		||||
      return frame;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -606,6 +602,16 @@ Extended Payload Length: {7}
 | 
			
		||||
        error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal void Unmask ()
 | 
			
		||||
    {
 | 
			
		||||
      if (_mask == Mask.Unmask)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
      _payloadData.Mask (_maskingKey);
 | 
			
		||||
      _maskingKey = new byte[0];
 | 
			
		||||
      _mask = Mask.Unmask;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Public Methods
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user