Skip to content

Commit 07e05fd

Browse files
sivukhingopherbot
authored andcommitted
http2: remove suspicious uint32->v conversion in frame code
Function maxHeaderStringLen(...) uses uint32(int(v)) == v check to validate if length will fit in the int type. This check is a no-op on any architecture because int type always has at least 32 bits, so we can potentially encounter negative return values from maxHeaderStringLen(...) function. This can be bad as this outcome clearly breaks code intention and maybe some further code invariants. This patch replaces uint32(int(v)) == v check with more robust and simpler int(v) > 0 validation which is correct for our case when we operating with uint32 Fixes golang/go#64961 Change-Id: I31f95709df9d25593ade3200696ac5cef9f88652 Reviewed-on: https://go-review.googlesource.com/c/net/+/554235 Auto-Submit: Dmitri Shuralyov <[email protected]> Reviewed-by: Damien Neil <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent 26b646e commit 07e05fd

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

http2/frame.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -1510,13 +1510,12 @@ func (mh *MetaHeadersFrame) checkPseudos() error {
15101510
}
15111511

15121512
func (fr *Framer) maxHeaderStringLen() int {
1513-
v := fr.maxHeaderListSize()
1514-
if uint32(int(v)) == v {
1515-
return int(v)
1513+
v := int(fr.maxHeaderListSize())
1514+
if v < 0 {
1515+
// If maxHeaderListSize overflows an int, use no limit (0).
1516+
return 0
15161517
}
1517-
// They had a crazy big number for MaxHeaderBytes anyway,
1518-
// so give them unlimited header lengths:
1519-
return 0
1518+
return v
15201519
}
15211520

15221521
// readMetaFrame returns 0 or more CONTINUATION frames from fr and

0 commit comments

Comments
 (0)