免责声明:我没有在这里遇到问题,但我正在开发一个HTTP/2实现,并看到了一些可能不符合规范的内容。
下面链接的代码包含一个循环,如果窗口大小增量高于HTTP/2规范允许的最大值,它将发送多个WINDOW_UPDATE
帧。在循环退出后,它会发送最后一个WINDOW_UPDATE
帧。
https://github.com/golang/net/blob/74de082e2cca95839e88aa0aeee5aadf6ce7710f/http2/server.go#L2189-L2193
然而,由于检查内容为:for n >= maxUint31
,如果初始的n
是2^31 - 1的倍数,则发送的最后一个帧可能包含窗口大小增量的0。这是HTTP/2规范所不允许的:
来自:https://httpwg.org/specs/rfc7540.html#rfc.section.6.9
接收者必须将收到具有流控制窗口增量的0的WINDOW_UPDATE帧视为类型为PROTOCOL_ERROR的流错误(第5.4.2节);连接流控制窗口上的错误必须被视为连接错误(第5.4.1节)。
我认为这里的修复方法只需将>=
检查更改为>
。我怀疑之前没有人遇到这个问题的原因是因为在实际应用中满足这个bug的所有条件的可能性非常低。
P.S.:问题模板中的问题并不真正适用于这个问题。如果这不很有帮助,请提前道歉。
1条答案
按热度按时间vltsax251#
@bradfitz