Properly update examined when parsing chunked requests (part 2) (#8360)
This commit is contained in:
parent
bc009fc0f1
commit
1ac6f3d4fd
|
|
@ -323,7 +323,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigned this before calculating the chunk size since that can throw
|
// Advance examined before possibly throwing, so we don't risk examining less than the previous call to ParseChunkedPrefix.
|
||||||
examined = reader.Position;
|
examined = reader.Position;
|
||||||
|
|
||||||
var chunkSize = CalculateChunkSize(ch1, 0);
|
var chunkSize = CalculateChunkSize(ch1, 0);
|
||||||
|
|
@ -348,10 +348,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Advance examined before possibly throwing, so we don't risk examining less than the previous call to ParseChunkedPrefix.
|
||||||
|
examined = reader.Position;
|
||||||
|
|
||||||
if (ch1 == '\r' && ch2 == '\n')
|
if (ch1 == '\r' && ch2 == '\n')
|
||||||
{
|
{
|
||||||
consumed = reader.Position;
|
consumed = reader.Position;
|
||||||
examined = reader.Position;
|
|
||||||
|
|
||||||
AddAndCheckConsumedBytes(reader.Consumed);
|
AddAndCheckConsumedBytes(reader.Consumed);
|
||||||
_inputLength = chunkSize;
|
_inputLength = chunkSize;
|
||||||
|
|
@ -363,9 +365,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
ch1 = ch2;
|
ch1 = ch2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set examined so that we capture the progress that way made
|
|
||||||
examined = reader.Position;
|
|
||||||
|
|
||||||
// At this point, 10 bytes have been consumed which is enough to parse the max value "7FFFFFFF\r\n".
|
// At this point, 10 bytes have been consumed which is enough to parse the max value "7FFFFFFF\r\n".
|
||||||
BadHttpRequestException.Throw(RequestRejectionReason.BadChunkSizeData);
|
BadHttpRequestException.Throw(RequestRejectionReason.BadChunkSizeData);
|
||||||
}
|
}
|
||||||
|
|
@ -453,10 +452,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
|
|
||||||
var suffixBuffer = buffer.Slice(0, 2);
|
var suffixBuffer = buffer.Slice(0, 2);
|
||||||
var suffixSpan = suffixBuffer.ToSpan();
|
var suffixSpan = suffixBuffer.ToSpan();
|
||||||
|
|
||||||
|
// Advance examined before possibly throwing, so we don't risk examining less than the previous call to ParseChunkedSuffix.
|
||||||
|
examined = suffixBuffer.End;
|
||||||
|
|
||||||
if (suffixSpan[0] == '\r' && suffixSpan[1] == '\n')
|
if (suffixSpan[0] == '\r' && suffixSpan[1] == '\n')
|
||||||
{
|
{
|
||||||
consumed = suffixBuffer.End;
|
consumed = suffixBuffer.End;
|
||||||
examined = suffixBuffer.End;
|
|
||||||
AddAndCheckConsumedBytes(2);
|
AddAndCheckConsumedBytes(2);
|
||||||
_mode = Mode.Prefix;
|
_mode = Mode.Prefix;
|
||||||
}
|
}
|
||||||
|
|
@ -480,10 +482,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
var trailerBuffer = buffer.Slice(0, 2);
|
var trailerBuffer = buffer.Slice(0, 2);
|
||||||
var trailerSpan = trailerBuffer.ToSpan();
|
var trailerSpan = trailerBuffer.ToSpan();
|
||||||
|
|
||||||
|
// Advance examined before possibly throwing, so we don't risk examining less than the previous call to ParseChunkedTrailer.
|
||||||
|
examined = trailerBuffer.End;
|
||||||
|
|
||||||
if (trailerSpan[0] == '\r' && trailerSpan[1] == '\n')
|
if (trailerSpan[0] == '\r' && trailerSpan[1] == '\n')
|
||||||
{
|
{
|
||||||
consumed = trailerBuffer.End;
|
consumed = trailerBuffer.End;
|
||||||
examined = trailerBuffer.End;
|
|
||||||
AddAndCheckConsumedBytes(2);
|
AddAndCheckConsumedBytes(2);
|
||||||
_mode = Mode.Complete;
|
_mode = Mode.Complete;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue