Skip to content

Commit 7ced4d6

Browse files
authored
Fix for Kestrel's ParseHeaders throwing ArgumentOutOfRange exception (#61316)
1 parent c22a853 commit 7ced4d6

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public bool ParseHeaders(TRequestHandler handler, ref SequenceReader<byte> reade
250250
else
251251
{
252252
// Include the thing after the CR in the rejection exception.
253-
var stopIndex = crIndex + 2;
253+
var stopIndex = Math.Min(crIndex + 2, span.Length);
254254
RejectRequestHeader(span[..stopIndex]);
255255
}
256256
}

src/Servers/Kestrel/Core/test/HttpParserTests.cs

+21
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,27 @@ public void ParseHeadersWithSplitBuffersThrowsForSmallHeader()
795795
Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
796796
}
797797

798+
[Fact]
799+
public void ParseMultispanHeaderWithCrAtSpanEnd()
800+
{
801+
var parser = CreateParser(CreateEnabledTrace(), false);
802+
803+
var buffer = ReadOnlySequenceFactory.CreateSegments(
804+
Encoding.ASCII.GetBytes("Head\r"),
805+
Encoding.ASCII.GetBytes("va\r"));
806+
var requestHandler = new RequestHandler();
807+
808+
var reader = new SequenceReader<byte>(buffer);
809+
810+
#pragma warning disable CS0618 // Type or member is obsolete
811+
var exception = Assert.Throws<BadHttpRequestException>(() =>
812+
#pragma warning restore CS0618 // Type or member is obsolete
813+
{
814+
var reader = new SequenceReader<byte>(buffer);
815+
parser.ParseHeaders(requestHandler, ref reader);
816+
});
817+
}
818+
798819
private bool ParseRequestLine(IHttpParser<RequestHandler> parser, RequestHandler requestHandler, ReadOnlySequence<byte> readableBuffer, out SequencePosition consumed, out SequencePosition examined)
799820
{
800821
var reader = new SequenceReader<byte>(readableBuffer);

0 commit comments

Comments
 (0)