Skip to content

Commit b7c8d5c

Browse files
committed
#17 - Validate close frame body.
1 parent e8c4985 commit b7c8d5c

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

src/Microsoft.AspNet.WebSockets.Protocol/CommonWebSocket.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,19 @@ private async Task<WebSocketReceiveResult> ProcessCloseFrameAsync(CancellationTo
414414
Utilities.MaskInPlace(_frameInProgress.MaskKey, new ArraySegment<byte>(_receiveBuffer, _receiveBufferOffset, (int)_frameBytesRemaining));
415415
}
416416
_closeStatus = (WebSocketCloseStatus)((_receiveBuffer[_receiveBufferOffset] << 8) | _receiveBuffer[_receiveBufferOffset + 1]);
417-
_closeStatusDescription = Encoding.UTF8.GetString(_receiveBuffer, _receiveBufferOffset + 2, (int)_frameBytesRemaining - 2) ?? string.Empty;
417+
try
418+
{
419+
var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
420+
_closeStatusDescription = encoding.GetString(_receiveBuffer, _receiveBufferOffset + 2, (int)_frameBytesRemaining - 2) ?? string.Empty;
421+
}
422+
catch (DecoderFallbackException)
423+
{
424+
await SendErrorAbortAndThrow(WebSocketCloseStatus.ProtocolError, "Invalid UTF-8 close message.", cancellationToken);
425+
}
426+
}
427+
else if (_frameBytesRemaining == 1)
428+
{
429+
await SendErrorAbortAndThrow(WebSocketCloseStatus.ProtocolError, "Invalid close body.", cancellationToken);
418430
}
419431
else
420432
{

src/Microsoft.AspNet.WebSockets.Protocol/project.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"System.Security.Cryptography.Hashing.Algorithms": "4.0.0-beta-*",
1515
"System.Threading": "4.0.0-beta-*",
1616
"System.Threading.Tasks": "4.0.10-beta-*",
17+
"System.Text.Encoding.Extensions": "4.0.10-beta-*",
1718
"System.Threading.Timer": "4.0.0-beta-*"
1819
}
1920
}

0 commit comments

Comments
 (0)