xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-devtools/go/go-1.18/CVE-2022-41723.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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