Skip to content
代码片段 群组 项目
未验证 提交 de2fa6d9 编辑于 作者: Chris Ross's avatar Chris Ross 提交者: GitHub
浏览文件

[6.0] Limit the hpack buffer resize (#44645)

* Limit the hpack buffer resize #44643
* More resize
上级 9369e71c
No related branches found
No related tags found
无相关合并请求
...@@ -572,7 +572,7 @@ namespace System.Net.Http.HPack ...@@ -572,7 +572,7 @@ namespace System.Net.Http.HPack
throw new HPackDecodingException(SR.Format(SR.net_http_headers_exceeded_length, _maxHeadersLength)); throw new HPackDecodingException(SR.Format(SR.net_http_headers_exceeded_length, _maxHeadersLength));
} }
_stringOctets = new byte[Math.Max(length, _stringOctets.Length * 2)]; _stringOctets = new byte[Math.Max(length, Math.Min(_stringOctets.Length * 2, _maxHeadersLength))];
} }
_stringLength = length; _stringLength = length;
...@@ -620,7 +620,7 @@ namespace System.Net.Http.HPack ...@@ -620,7 +620,7 @@ namespace System.Net.Http.HPack
{ {
if (dst.Length < _stringLength) if (dst.Length < _stringLength)
{ {
dst = new byte[Math.Max(_stringLength, dst.Length * 2)]; dst = new byte[Math.Max(_stringLength, Math.Min(dst.Length * 2, _maxHeadersLength))];
} }
} }
......
...@@ -493,6 +493,41 @@ namespace System.Net.Http.Unit.Tests.HPack ...@@ -493,6 +493,41 @@ namespace System.Net.Http.Unit.Tests.HPack
Assert.Equal(string8193, _handler.DecodedHeaders[string8193]); Assert.Equal(string8193, _handler.DecodedHeaders[string8193]);
} }
[Fact]
public void DecodesStringLength_ExceedsLimit_Throws()
{
HPackDecoder decoder = new HPackDecoder(DynamicTableInitialMaxSize, MaxHeaderFieldSize + 1);
string string8191 = new string('a', MaxHeaderFieldSize - 1);
string string8193 = new string('a', MaxHeaderFieldSize + 1);
string string8194 = new string('a', MaxHeaderFieldSize + 2);
var bytes = new byte[3];
var success = IntegerEncoder.Encode(8194, 7, bytes, out var written);
byte[] encoded = _literalHeaderFieldWithoutIndexingNewName
.Concat(new byte[] { 0x7f, 0x80, 0x3f }) // 8191 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8191))
.Concat(new byte[] { 0x7f, 0x80, 0x3f }) // 8191 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8191))
.Concat(_literalHeaderFieldWithoutIndexingNewName)
.Concat(new byte[] { 0x7f, 0x82, 0x3f }) // 8193 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8193))
.Concat(new byte[] { 0x7f, 0x82, 0x3f }) // 8193 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8193))
.Concat(_literalHeaderFieldWithoutIndexingNewName)
.Concat(new byte[] { 0x7f, 0x83, 0x3f }) // 8194 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8194))
.Concat(new byte[] { 0x7f, 0x83, 0x3f }) // 8194 encoded with 7-bit prefix, no Huffman encoding
.Concat(Encoding.ASCII.GetBytes(string8194))
.ToArray();
var ex = Assert.Throws<HPackDecodingException>(() => decoder.Decode(encoded, endHeaders: true, handler: _handler));
Assert.Equal(SR.Format(SR.net_http_headers_exceeded_length, MaxHeaderFieldSize + 1), ex.Message);
Assert.Equal(string8191, _handler.DecodedHeaders[string8191]);
Assert.Equal(string8193, _handler.DecodedHeaders[string8193]);
Assert.False(_handler.DecodedHeaders.ContainsKey(string8194));
}
[Fact] [Fact]
public void DecodesStringLength_IndividualBytes() public void DecodesStringLength_IndividualBytes()
{ {
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册