1*4882a593SmuzhiyunFrom 451766789f646617157c725e20c955d4a9a70d4e Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Roland Shoemaker <bracewell@google.com> 3*4882a593SmuzhiyunDate: Mon, 6 Feb 2023 10:03:44 -0800 4*4882a593SmuzhiyunSubject: [PATCH] net/http: update bundled golang.org/x/net/http2 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunDisable cmd/internal/moddeps test, since this update includes PRIVATE 7*4882a593Smuzhiyuntrack fixes. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunFixes CVE-2022-41723 10*4882a593SmuzhiyunFixes #58355 11*4882a593SmuzhiyunUpdates #57855 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunChange-Id: Ie870562a6f6e44e4e8f57db6a0dde1a41a2b090c 14*4882a593SmuzhiyunReviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1728939 15*4882a593SmuzhiyunReviewed-by: Damien Neil <dneil@google.com> 16*4882a593SmuzhiyunReviewed-by: Julie Qiu <julieqiu@google.com> 17*4882a593SmuzhiyunReviewed-by: Tatiana Bradley <tatianabradley@google.com> 18*4882a593SmuzhiyunRun-TryBot: Roland Shoemaker <bracewell@google.com> 19*4882a593SmuzhiyunReviewed-on: https://go-review.googlesource.com/c/go/+/468118 20*4882a593SmuzhiyunTryBot-Result: Gopher Robot <gobot@golang.org> 21*4882a593SmuzhiyunRun-TryBot: Michael Pratt <mpratt@google.com> 22*4882a593SmuzhiyunAuto-Submit: Michael Pratt <mpratt@google.com> 23*4882a593SmuzhiyunReviewed-by: Than McIntosh <thanm@google.com> 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunUpstream-Status: Backport [https://github.com/golang/go/commit/5c3e11bd0b5c0a86e5beffcd4339b86a902b21c3] 26*4882a593SmuzhiyunCVE: CVE-2022-41723 27*4882a593SmuzhiyunSigned-off-by: Shubham Kulkarni <skulkarni@mvista.com> 28*4882a593Smuzhiyun--- 29*4882a593Smuzhiyun src/vendor/golang.org/x/net/http2/hpack/hpack.go | 79 +++++++++++++++--------- 30*4882a593Smuzhiyun 1 file changed, 49 insertions(+), 30 deletions(-) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyundiff --git a/src/vendor/golang.org/x/net/http2/hpack/hpack.go b/src/vendor/golang.org/x/net/http2/hpack/hpack.go 33*4882a593Smuzhiyunindex 85f18a2..02e80e3 100644 34*4882a593Smuzhiyun--- a/src/vendor/golang.org/x/net/http2/hpack/hpack.go 35*4882a593Smuzhiyun+++ b/src/vendor/golang.org/x/net/http2/hpack/hpack.go 36*4882a593Smuzhiyun@@ -359,6 +359,7 @@ func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun var hf HeaderField 39*4882a593Smuzhiyun wantStr := d.emitEnabled || it.indexed() 40*4882a593Smuzhiyun+ var undecodedName undecodedString 41*4882a593Smuzhiyun if nameIdx > 0 { 42*4882a593Smuzhiyun ihf, ok := d.at(nameIdx) 43*4882a593Smuzhiyun if !ok { 44*4882a593Smuzhiyun@@ -366,15 +367,27 @@ func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { 45*4882a593Smuzhiyun } 46*4882a593Smuzhiyun hf.Name = ihf.Name 47*4882a593Smuzhiyun } else { 48*4882a593Smuzhiyun- hf.Name, buf, err = d.readString(buf, wantStr) 49*4882a593Smuzhiyun+ undecodedName, buf, err = d.readString(buf) 50*4882a593Smuzhiyun if err != nil { 51*4882a593Smuzhiyun return err 52*4882a593Smuzhiyun } 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun- hf.Value, buf, err = d.readString(buf, wantStr) 55*4882a593Smuzhiyun+ undecodedValue, buf, err := d.readString(buf) 56*4882a593Smuzhiyun if err != nil { 57*4882a593Smuzhiyun return err 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun+ if wantStr { 60*4882a593Smuzhiyun+ if nameIdx <= 0 { 61*4882a593Smuzhiyun+ hf.Name, err = d.decodeString(undecodedName) 62*4882a593Smuzhiyun+ if err != nil { 63*4882a593Smuzhiyun+ return err 64*4882a593Smuzhiyun+ } 65*4882a593Smuzhiyun+ } 66*4882a593Smuzhiyun+ hf.Value, err = d.decodeString(undecodedValue) 67*4882a593Smuzhiyun+ if err != nil { 68*4882a593Smuzhiyun+ return err 69*4882a593Smuzhiyun+ } 70*4882a593Smuzhiyun+ } 71*4882a593Smuzhiyun d.buf = buf 72*4882a593Smuzhiyun if it.indexed() { 73*4882a593Smuzhiyun d.dynTab.add(hf) 74*4882a593Smuzhiyun@@ -459,46 +472,52 @@ func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { 75*4882a593Smuzhiyun return 0, origP, errNeedMore 76*4882a593Smuzhiyun } 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun-// readString decodes an hpack string from p. 79*4882a593Smuzhiyun+// readString reads an hpack string from p. 80*4882a593Smuzhiyun // 81*4882a593Smuzhiyun-// wantStr is whether s will be used. If false, decompression and 82*4882a593Smuzhiyun-// []byte->string garbage are skipped if s will be ignored 83*4882a593Smuzhiyun-// anyway. This does mean that huffman decoding errors for non-indexed 84*4882a593Smuzhiyun-// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server 85*4882a593Smuzhiyun-// is returning an error anyway, and because they're not indexed, the error 86*4882a593Smuzhiyun-// won't affect the decoding state. 87*4882a593Smuzhiyun-func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { 88*4882a593Smuzhiyun+// It returns a reference to the encoded string data to permit deferring decode costs 89*4882a593Smuzhiyun+// until after the caller verifies all data is present. 90*4882a593Smuzhiyun+func (d *Decoder) readString(p []byte) (u undecodedString, remain []byte, err error) { 91*4882a593Smuzhiyun if len(p) == 0 { 92*4882a593Smuzhiyun- return "", p, errNeedMore 93*4882a593Smuzhiyun+ return u, p, errNeedMore 94*4882a593Smuzhiyun } 95*4882a593Smuzhiyun isHuff := p[0]&128 != 0 96*4882a593Smuzhiyun strLen, p, err := readVarInt(7, p) 97*4882a593Smuzhiyun if err != nil { 98*4882a593Smuzhiyun- return "", p, err 99*4882a593Smuzhiyun+ return u, p, err 100*4882a593Smuzhiyun } 101*4882a593Smuzhiyun if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { 102*4882a593Smuzhiyun- return "", nil, ErrStringLength 103*4882a593Smuzhiyun+ // Returning an error here means Huffman decoding errors 104*4882a593Smuzhiyun+ // for non-indexed strings past the maximum string length 105*4882a593Smuzhiyun+ // are ignored, but the server is returning an error anyway 106*4882a593Smuzhiyun+ // and because the string is not indexed the error will not 107*4882a593Smuzhiyun+ // affect the decoding state. 108*4882a593Smuzhiyun+ return u, nil, ErrStringLength 109*4882a593Smuzhiyun } 110*4882a593Smuzhiyun if uint64(len(p)) < strLen { 111*4882a593Smuzhiyun- return "", p, errNeedMore 112*4882a593Smuzhiyun- } 113*4882a593Smuzhiyun- if !isHuff { 114*4882a593Smuzhiyun- if wantStr { 115*4882a593Smuzhiyun- s = string(p[:strLen]) 116*4882a593Smuzhiyun- } 117*4882a593Smuzhiyun- return s, p[strLen:], nil 118*4882a593Smuzhiyun+ return u, p, errNeedMore 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun+ u.isHuff = isHuff 121*4882a593Smuzhiyun+ u.b = p[:strLen] 122*4882a593Smuzhiyun+ return u, p[strLen:], nil 123*4882a593Smuzhiyun+} 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun- if wantStr { 126*4882a593Smuzhiyun- buf := bufPool.Get().(*bytes.Buffer) 127*4882a593Smuzhiyun- buf.Reset() // don't trust others 128*4882a593Smuzhiyun- defer bufPool.Put(buf) 129*4882a593Smuzhiyun- if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { 130*4882a593Smuzhiyun- buf.Reset() 131*4882a593Smuzhiyun- return "", nil, err 132*4882a593Smuzhiyun- } 133*4882a593Smuzhiyun+type undecodedString struct { 134*4882a593Smuzhiyun+ isHuff bool 135*4882a593Smuzhiyun+ b []byte 136*4882a593Smuzhiyun+} 137*4882a593Smuzhiyun+ 138*4882a593Smuzhiyun+func (d *Decoder) decodeString(u undecodedString) (string, error) { 139*4882a593Smuzhiyun+ if !u.isHuff { 140*4882a593Smuzhiyun+ return string(u.b), nil 141*4882a593Smuzhiyun+ } 142*4882a593Smuzhiyun+ buf := bufPool.Get().(*bytes.Buffer) 143*4882a593Smuzhiyun+ buf.Reset() // don't trust others 144*4882a593Smuzhiyun+ var s string 145*4882a593Smuzhiyun+ err := huffmanDecode(buf, d.maxStrLen, u.b) 146*4882a593Smuzhiyun+ if err == nil { 147*4882a593Smuzhiyun s = buf.String() 148*4882a593Smuzhiyun- buf.Reset() // be nice to GC 149*4882a593Smuzhiyun } 150*4882a593Smuzhiyun- return s, p[strLen:], nil 151*4882a593Smuzhiyun+ buf.Reset() // be nice to GC 152*4882a593Smuzhiyun+ bufPool.Put(buf) 153*4882a593Smuzhiyun+ return s, err 154*4882a593Smuzhiyun } 155*4882a593Smuzhiyun-- 156*4882a593Smuzhiyun2.7.4 157