diff --git a/src/coreclr/tools/Common/JitInterface/SystemVStructClassificator.cs b/src/coreclr/tools/Common/JitInterface/SystemVStructClassificator.cs
index 55b8e2d1dc02c8..c4105d1ce91739 100644
--- a/src/coreclr/tools/Common/JitInterface/SystemVStructClassificator.cs
+++ b/src/coreclr/tools/Common/JitInterface/SystemVStructClassificator.cs
@@ -158,7 +158,7 @@ private static SystemVClassificationType TypeDef2SystemVClassification(TypeDesc
case TypeFlags.GenericParameter:
case TypeFlags.SignatureTypeVariable:
case TypeFlags.SignatureMethodVariable:
- Debug.Assert(false, $"Type {typeDesc} with unexpected category {typeDesc.Category}");
+ Debug.Fail($"Type {typeDesc} with unexpected category {typeDesc.Category}");
return SystemVClassificationTypeUnknown;
default:
return SystemVClassificationTypeUnknown;
diff --git a/src/libraries/System.Net.WebSockets/src/Resources/Strings.resx b/src/libraries/System.Net.WebSockets/src/Resources/Strings.resx
index 693f8d3863fd7f..e96ac19e3f8ef4 100644
--- a/src/libraries/System.Net.WebSockets/src/Resources/Strings.resx
+++ b/src/libraries/System.Net.WebSockets/src/Resources/Strings.resx
@@ -165,4 +165,7 @@
The compression options for a continuation cannot be different than the options used to send the first fragment of the message.
-
\ No newline at end of file
+
+ The WebSocket received a frame with an invalid payload length.
+
+
diff --git a/src/libraries/System.Net.WebSockets/src/System/Net/WebSockets/ManagedWebSocket.cs b/src/libraries/System.Net.WebSockets/src/System/Net/WebSockets/ManagedWebSocket.cs
index 05b171cf94ed72..ec62d92ac11a9a 100644
--- a/src/libraries/System.Net.WebSockets/src/System/Net/WebSockets/ManagedWebSocket.cs
+++ b/src/libraries/System.Net.WebSockets/src/System/Net/WebSockets/ManagedWebSocket.cs
@@ -1116,6 +1116,14 @@ private async ValueTask CloseWithReceiveErrorAndThrowAsync(
return SR.net_Websockets_ReservedBitsSet;
}
+ if (header.PayloadLength < 0)
+ {
+ // as per RFC, if payload length is a 64-bit integer, the most significant bit MUST be 0
+ // frame-payload-length-63 = %x0000000000000000-7FFFFFFFFFFFFFFF; 64 bits in length
+ resultHeader = default;
+ return SR.net_Websockets_InvalidPayloadLength;
+ }
+
if (header.Compressed && _inflater is null)
{
resultHeader = default;
diff --git a/src/libraries/System.Net.WebSockets/tests/WebSocketCreateTest.cs b/src/libraries/System.Net.WebSockets/tests/WebSocketCreateTest.cs
index f940df0add3aee..f9fd4e3c564e57 100644
--- a/src/libraries/System.Net.WebSockets/tests/WebSocketCreateTest.cs
+++ b/src/libraries/System.Net.WebSockets/tests/WebSocketCreateTest.cs
@@ -149,6 +149,37 @@ public async Task ReceiveAsync_InvalidFrameHeader_AbortsAndThrowsException(byte
}
}
+ [Theory]
+ [InlineData(new byte[] { 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, false)] // max allowed value
+ [InlineData(new byte[] { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, true)]
+ public async Task ReceiveAsync_InvalidPayloadLength_AbortsAndThrowsException(byte[] lenBytes, bool shouldFail)
+ {
+ var frame = new byte[11];
+ frame[0] = 0b1_000_0010; // FIN, RSV, OPCODE
+ frame[1] = 0b0_1111111; // MASK, PAYLOAD_LEN
+ Assert.Equal(8, lenBytes.Length);
+ Array.Copy(lenBytes, 0, frame, 2, lenBytes.Length); // EXTENDED_PAYLOAD_LEN
+ frame[10] = (byte)'a';
+
+ using var stream = new MemoryStream(frame, writable: true);
+ using WebSocket websocket = CreateFromStream(stream, false, null, Timeout.InfiniteTimeSpan);
+
+ var buffer = new byte[1];
+ Task t = websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
+ if (shouldFail)
+ {
+ var exc = await Assert.ThrowsAsync(() => t);
+ Assert.Equal(WebSocketState.Aborted, websocket.State);
+ }
+ else
+ {
+ WebSocketReceiveResult result = await t;
+ Assert.False(result.EndOfMessage);
+ Assert.Equal(1, result.Count);
+ Assert.Equal('a', (char)buffer[0]);
+ }
+ }
+
[Fact]
[SkipOnPlatform(TestPlatforms.Browser, "System.Net.Sockets is not supported on this platform.")]
[ActiveIssue("https://github.com/dotnet/runtime/issues/34690", TestPlatforms.Windows, TargetFrameworkMonikers.Netcoreapp, TestRuntimes.Mono)]
diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c
index 5b607e55636ead..5d17be0c34a7dc 100644
--- a/src/mono/mono/mini/method-to-ir.c
+++ b/src/mono/mono/mini/method-to-ir.c
@@ -7314,7 +7314,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
sp -= n;
- if (virtual_ && cmethod && sp [0]->opcode == OP_TYPED_OBJREF) {
+ if (virtual_ && cmethod && sp [0] && sp [0]->opcode == OP_TYPED_OBJREF) {
ERROR_DECL (error);
MonoMethod *new_cmethod = mono_class_get_virtual_method (sp [0]->klass, cmethod, error);