!282 sync: synchronize with the openEuler-22.03-LTS-SP2
From: @hcnbxx Reviewed-by: @zhangsong234, @jing-rui Signed-off-by: @zhangsong234, @jing-rui
This commit is contained in:
commit
0de88730b6
@ -0,0 +1,180 @@
|
||||
From 67c5ff52473c4956893b7500656954a6d898f1ca Mon Sep 17 00:00:00 2001
|
||||
From: Roland Shoemaker <bracewell@google.com>
|
||||
Date: Wed, 7 Jun 2023 15:27:13 -0700
|
||||
Subject: [PATCH] [Backport] crypto/tls: restrict RSA keys in certificates to
|
||||
<= 8192 bits
|
||||
|
||||
Extremely large RSA keys in certificate chains can cause a client/server
|
||||
to expend significant CPU time verifying signatures. Limit this by
|
||||
restricting the size of RSA keys transmitted during handshakes to <=
|
||||
8192 bits.
|
||||
|
||||
Based on a survey of publicly trusted RSA keys, there are currently only
|
||||
three certificates in circulation with keys larger than this, and all
|
||||
three appear to be test certificates that are not actively deployed. It
|
||||
is possible there are larger keys in use in private PKIs, but we target
|
||||
the web PKI, so causing breakage here in the interests of increasing the
|
||||
default safety of users of crypto/tls seems reasonable.
|
||||
|
||||
Thanks to Mateusz Poliwczak for reporting this issue.
|
||||
|
||||
Note: The upstream does not submit this change to go1.17 according to the rules of MinorReleases.
|
||||
Corego3.x are based on go1.17.8. Therefore, it need to submit the change to corego3.x.
|
||||
|
||||
Edited-by: machangwang m00509938
|
||||
|
||||
Updates #61460
|
||||
Fixes #61579
|
||||
Fixes CVE-2023-29409
|
||||
|
||||
Change-Id: Ie35038515a649199a36a12fc2c5df3af855dca6c
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1912161
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
(cherry picked from commit d865c715d92887361e4bd5596e19e513f27781b7)
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1965487
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/514915
|
||||
Run-TryBot: David Chase <drchase@google.com>
|
||||
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
|
||||
TryBot-Bypass: David Chase <drchase@google.com>
|
||||
Signed-off-by: Ma Chang Wang machangwang@huawei.com
|
||||
|
||||
Reference: https://go-review.googlesource.com/c/go/+/514915
|
||||
Conflict:NA
|
||||
---
|
||||
src/crypto/tls/handshake_client.go | 8 +++
|
||||
src/crypto/tls/handshake_client_test.go | 78 +++++++++++++++++++++++++
|
||||
src/crypto/tls/handshake_server.go | 4 ++
|
||||
3 files changed, 90 insertions(+)
|
||||
|
||||
diff --git a/src/crypto/tls/handshake_client.go b/src/crypto/tls/handshake_client.go
|
||||
index 85622f159b..828d2cb378 100644
|
||||
--- a/src/crypto/tls/handshake_client.go
|
||||
+++ b/src/crypto/tls/handshake_client.go
|
||||
@@ -852,6 +852,10 @@ func (hs *clientHandshakeState) sendFinished(out []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
+// maxRSAKeySize is the maximum RSA key size in bits that we are willing
|
||||
+// to verify the signatures of during a TLS handshake.
|
||||
+const maxRSAKeySize = 8192
|
||||
+
|
||||
// verifyServerCertificate parses and verifies the provided chain, setting
|
||||
// c.verifiedChains and c.peerCertificates or sending the appropriate alert.
|
||||
func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
|
||||
@@ -862,6 +866,10 @@ func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
|
||||
c.sendAlert(alertBadCertificate)
|
||||
return errors.New("tls: failed to parse certificate from server: " + err.Error())
|
||||
}
|
||||
+ if cert.PublicKeyAlgorithm == x509.RSA && cert.PublicKey.(*rsa.PublicKey).N.BitLen() > maxRSAKeySize {
|
||||
+ c.sendAlert(alertBadCertificate)
|
||||
+ return fmt.Errorf("tls: server sent certificate containing RSA key larger than %d bits", maxRSAKeySize)
|
||||
+ }
|
||||
certs[i] = cert
|
||||
}
|
||||
|
||||
diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go
|
||||
index 0228745155..d581cb1104 100644
|
||||
--- a/src/crypto/tls/handshake_client_test.go
|
||||
+++ b/src/crypto/tls/handshake_client_test.go
|
||||
@@ -2595,3 +2595,81 @@ func TestClientHandshakeContextCancellation(t *testing.T) {
|
||||
t.Error("Client connection was not closed when the context was canceled")
|
||||
}
|
||||
}
|
||||
+
|
||||
+// discardConn wraps a net.Conn but discards all writes, but reports that they happened.
|
||||
+type discardConn struct {
|
||||
+ net.Conn
|
||||
+}
|
||||
+
|
||||
+func (dc *discardConn) Write(data []byte) (int, error) {
|
||||
+ return len(data), nil
|
||||
+}
|
||||
+
|
||||
+// largeRSAKeyCertPEM contains a 8193 bit RSA key
|
||||
+const largeRSAKeyCertPEM = `-----BEGIN CERTIFICATE-----
|
||||
+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
|
||||
+u58=
|
||||
+-----END CERTIFICATE-----`
|
||||
+
|
||||
+func TestHandshakeRSATooBig(t *testing.T) {
|
||||
+ testCert, _ := pem.Decode([]byte(largeRSAKeyCertPEM))
|
||||
+
|
||||
+ c := &Conn{conn: &discardConn{}, config: testConfig.Clone()}
|
||||
+
|
||||
+ expectedErr := "tls: server sent certificate containing RSA key larger than 8192 bits"
|
||||
+ err := c.verifyServerCertificate([][]byte{testCert.Bytes})
|
||||
+ if err == nil || err.Error() != expectedErr {
|
||||
+ t.Errorf("Conn.verifyServerCertificate unexpected error: want %q, got %q", expectedErr, err)
|
||||
+ }
|
||||
+
|
||||
+ expectedErr = "tls: client sent certificate containing RSA key larger than 8192 bits"
|
||||
+ err = c.processCertsFromClient(Certificate{Certificate: [][]byte{testCert.Bytes}})
|
||||
+ if err == nil || err.Error() != expectedErr {
|
||||
+ t.Errorf("Conn.processCertsFromClient unexpected error: want %q, got %q", expectedErr, err)
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/crypto/tls/handshake_server.go b/src/crypto/tls/handshake_server.go
|
||||
index 8d51e7e55f..a5d8f4a9a8 100644
|
||||
--- a/src/crypto/tls/handshake_server.go
|
||||
+++ b/src/crypto/tls/handshake_server.go
|
||||
@@ -812,6 +812,10 @@ func (c *Conn) processCertsFromClient(certificate Certificate) error {
|
||||
c.sendAlert(alertBadCertificate)
|
||||
return errors.New("tls: failed to parse client certificate: " + err.Error())
|
||||
}
|
||||
+ if certs[i].PublicKeyAlgorithm == x509.RSA && certs[i].PublicKey.(*rsa.PublicKey).N.BitLen() > maxRSAKeySize {
|
||||
+ c.sendAlert(alertBadCertificate)
|
||||
+ return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", maxRSAKeySize)
|
||||
+ }
|
||||
}
|
||||
|
||||
if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
|
||||
--
|
||||
2.33.0
|
||||
|
||||
267
0050-Backport-html-template-support-HTML-like-comments-in.patch
Normal file
267
0050-Backport-html-template-support-HTML-like-comments-in.patch
Normal file
@ -0,0 +1,267 @@
|
||||
From fc0e2bd566a8e8777acc824211f6027184840a49 Mon Sep 17 00:00:00 2001
|
||||
From: Roland Shoemaker <bracewell@google.com>
|
||||
Date: Fri, 4 Aug 2023 03:24:13 +0800
|
||||
Subject: [PATCH 1/2] [Backport] html/template: support HTML-like comments in
|
||||
script contexts
|
||||
|
||||
Reference: https://open.codehub.huawei.com/OpenSourceCenter/golang/go/merge_requests/89
|
||||
Conflict: NA
|
||||
|
||||
Per Appendix B.1.1 of the ECMAScript specification, support HTML-like
|
||||
comments in script contexts. Also per section 12.5, support hashbang
|
||||
comments. This brings our parsing in-line with how browsers treat these
|
||||
comment types.
|
||||
|
||||
Thanks to Takeshi Kaneko (GMO Cybersecurity by Ierae, Inc.) for
|
||||
reporting this issue.
|
||||
|
||||
Note: The upstream does not submit this change to go1.17 according to the rules of MinorReleases.
|
||||
Corego3.x are based on go1.17.8. Therefore, it need to submit the change to corego3.x.
|
||||
|
||||
Edited-by: machangwang m00509938
|
||||
|
||||
Fixes #62196
|
||||
Fixes #62395
|
||||
Fixes CVE-2023-39318
|
||||
|
||||
Change-Id: Id512702c5de3ae46cf648e268cb10e1eb392a181
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1976593
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2014620
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/526098
|
||||
Run-TryBot: Cherry Mui <cherryyz@google.com>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
|
||||
Signed-off-by: Ma Chang Wang machangwang@huawei.com
|
||||
---
|
||||
src/html/template/context.go | 6 ++-
|
||||
src/html/template/escape.go | 5 +-
|
||||
src/html/template/escape_test.go | 10 ++++
|
||||
src/html/template/state_string.go | 26 +++++-----
|
||||
src/html/template/transition.go | 80 ++++++++++++++++++++-----------
|
||||
5 files changed, 84 insertions(+), 43 deletions(-)
|
||||
|
||||
diff --git a/src/html/template/context.go b/src/html/template/context.go
|
||||
index a67b5a7871..472b5a9772 100644
|
||||
--- a/src/html/template/context.go
|
||||
+++ b/src/html/template/context.go
|
||||
@@ -124,6 +124,10 @@ const (
|
||||
stateJSBlockCmt
|
||||
// stateJSLineCmt occurs inside a JavaScript // line comment.
|
||||
stateJSLineCmt
|
||||
+ // stateJSHTMLOpenCmt occurs inside a JavaScript <!-- HTML-like comment.
|
||||
+ stateJSHTMLOpenCmt
|
||||
+ // stateJSHTMLCloseCmt occurs inside a JavaScript --> HTML-like comment.
|
||||
+ stateJSHTMLCloseCmt
|
||||
// stateCSS occurs inside a <style> element or style attribute.
|
||||
stateCSS
|
||||
// stateCSSDqStr occurs inside a CSS double quoted string.
|
||||
@@ -151,7 +155,7 @@ const (
|
||||
// authors & maintainers, not for end-users or machines.
|
||||
func isComment(s state) bool {
|
||||
switch s {
|
||||
- case stateHTMLCmt, stateJSBlockCmt, stateJSLineCmt, stateCSSBlockCmt, stateCSSLineCmt:
|
||||
+ case stateHTMLCmt, stateJSBlockCmt, stateJSLineCmt, stateJSHTMLOpenCmt, stateJSHTMLCloseCmt, stateCSSBlockCmt, stateCSSLineCmt:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
diff --git a/src/html/template/escape.go b/src/html/template/escape.go
|
||||
index bdccc65a57..3249c67008 100644
|
||||
--- a/src/html/template/escape.go
|
||||
+++ b/src/html/template/escape.go
|
||||
@@ -700,9 +700,12 @@ func (e *escaper) escapeText(c context, n *parse.TextNode) context {
|
||||
if c.state != c1.state && isComment(c1.state) && c1.delim == delimNone {
|
||||
// Preserve the portion between written and the comment start.
|
||||
cs := i1 - 2
|
||||
- if c1.state == stateHTMLCmt {
|
||||
+ if c1.state == stateHTMLCmt || c1.state == stateJSHTMLOpenCmt {
|
||||
// "<!--" instead of "/*" or "//"
|
||||
cs -= 2
|
||||
+ } else if c1.state == stateJSHTMLCloseCmt {
|
||||
+ // "-->" instead of "/*" or "//"
|
||||
+ cs -= 1
|
||||
}
|
||||
b.Write(s[written:cs])
|
||||
written = i1
|
||||
diff --git a/src/html/template/escape_test.go b/src/html/template/escape_test.go
|
||||
index 3e17aee8f2..e38888a13f 100644
|
||||
--- a/src/html/template/escape_test.go
|
||||
+++ b/src/html/template/escape_test.go
|
||||
@@ -503,6 +503,16 @@ func TestEscape(t *testing.T) {
|
||||
"<script>var a/*b*///c\nd</script>",
|
||||
"<script>var a \nd</script>",
|
||||
},
|
||||
+ {
|
||||
+ "JS HTML-like comments",
|
||||
+ "<script>before <!-- beep\nbetween\nbefore-->boop\n</script>",
|
||||
+ "<script>before \nbetween\nbefore\n</script>",
|
||||
+ },
|
||||
+ {
|
||||
+ "JS hashbang comment",
|
||||
+ "<script>#! beep\n</script>",
|
||||
+ "<script>\n</script>",
|
||||
+ },
|
||||
{
|
||||
"CSS comments",
|
||||
"<style>p// paragraph\n" +
|
||||
diff --git a/src/html/template/state_string.go b/src/html/template/state_string.go
|
||||
index 6fb1a6eeb0..be7a920511 100644
|
||||
--- a/src/html/template/state_string.go
|
||||
+++ b/src/html/template/state_string.go
|
||||
@@ -25,21 +25,23 @@ func _() {
|
||||
_ = x[stateJSRegexp-14]
|
||||
_ = x[stateJSBlockCmt-15]
|
||||
_ = x[stateJSLineCmt-16]
|
||||
- _ = x[stateCSS-17]
|
||||
- _ = x[stateCSSDqStr-18]
|
||||
- _ = x[stateCSSSqStr-19]
|
||||
- _ = x[stateCSSDqURL-20]
|
||||
- _ = x[stateCSSSqURL-21]
|
||||
- _ = x[stateCSSURL-22]
|
||||
- _ = x[stateCSSBlockCmt-23]
|
||||
- _ = x[stateCSSLineCmt-24]
|
||||
- _ = x[stateError-25]
|
||||
- _ = x[stateDead-26]
|
||||
+ _ = x[stateJSHTMLOpenCmt-17]
|
||||
+ _ = x[stateJSHTMLCloseCmt-18]
|
||||
+ _ = x[stateCSS-19]
|
||||
+ _ = x[stateCSSDqStr-20]
|
||||
+ _ = x[stateCSSSqStr-21]
|
||||
+ _ = x[stateCSSDqURL-22]
|
||||
+ _ = x[stateCSSSqURL-23]
|
||||
+ _ = x[stateCSSURL-24]
|
||||
+ _ = x[stateCSSBlockCmt-25]
|
||||
+ _ = x[stateCSSLineCmt-26]
|
||||
+ _ = x[stateError-27]
|
||||
+ _ = x[stateDead-28]
|
||||
}
|
||||
|
||||
-const _state_name = "stateTextstateTagstateAttrNamestateAfterNamestateBeforeValuestateHTMLCmtstateRCDATAstateAttrstateURLstateSrcsetstateJSstateJSDqStrstateJSSqStrstateJSBqStrstateJSRegexpstateJSBlockCmtstateJSLineCmtstateCSSstateCSSDqStrstateCSSSqStrstateCSSDqURLstateCSSSqURLstateCSSURLstateCSSBlockCmtstateCSSLineCmtstateErrorstateDead"
|
||||
+const _state_name = "stateTextstateTagstateAttrNamestateAfterNamestateBeforeValuestateHTMLCmtstateRCDATAstateAttrstateURLstateSrcsetstateJSstateJSDqStrstateJSSqStrstateJSBqStrstateJSRegexpstateJSBlockCmtstateJSLineCmtstateJSHTMLOpenCmtstateJSHTMLCloseCmtstateCSSstateCSSDqStrstateCSSSqStrstateCSSDqURLstateCSSSqURLstateCSSURLstateCSSBlockCmtstateCSSLineCmtstateErrorstateDead"
|
||||
|
||||
-var _state_index = [...]uint16{0, 9, 17, 30, 44, 60, 72, 83, 92, 100, 111, 118, 130, 142, 154, 167, 182, 196, 204, 217, 230, 243, 256, 267, 283, 298, 308, 317}
|
||||
+var _state_index = [...]uint16{0, 9, 17, 30, 44, 60, 72, 83, 92, 100, 111, 118, 130, 142, 154, 167, 182, 196, 214, 233, 241, 254, 267, 280, 293, 304, 320, 335, 345, 354}
|
||||
|
||||
func (i state) String() string {
|
||||
if i >= state(len(_state_index)-1) {
|
||||
diff --git a/src/html/template/transition.go b/src/html/template/transition.go
|
||||
index 92eb351906..12aa4c41fe 100644
|
||||
--- a/src/html/template/transition.go
|
||||
+++ b/src/html/template/transition.go
|
||||
@@ -14,32 +14,34 @@ import (
|
||||
// the updated context and the number of bytes consumed from the front of the
|
||||
// input.
|
||||
var transitionFunc = [...]func(context, []byte) (context, int){
|
||||
- stateText: tText,
|
||||
- stateTag: tTag,
|
||||
- stateAttrName: tAttrName,
|
||||
- stateAfterName: tAfterName,
|
||||
- stateBeforeValue: tBeforeValue,
|
||||
- stateHTMLCmt: tHTMLCmt,
|
||||
- stateRCDATA: tSpecialTagEnd,
|
||||
- stateAttr: tAttr,
|
||||
- stateURL: tURL,
|
||||
- stateSrcset: tURL,
|
||||
- stateJS: tJS,
|
||||
- stateJSDqStr: tJSDelimited,
|
||||
- stateJSSqStr: tJSDelimited,
|
||||
- stateJSBqStr: tJSDelimited,
|
||||
- stateJSRegexp: tJSDelimited,
|
||||
- stateJSBlockCmt: tBlockCmt,
|
||||
- stateJSLineCmt: tLineCmt,
|
||||
- stateCSS: tCSS,
|
||||
- stateCSSDqStr: tCSSStr,
|
||||
- stateCSSSqStr: tCSSStr,
|
||||
- stateCSSDqURL: tCSSStr,
|
||||
- stateCSSSqURL: tCSSStr,
|
||||
- stateCSSURL: tCSSStr,
|
||||
- stateCSSBlockCmt: tBlockCmt,
|
||||
- stateCSSLineCmt: tLineCmt,
|
||||
- stateError: tError,
|
||||
+ stateText: tText,
|
||||
+ stateTag: tTag,
|
||||
+ stateAttrName: tAttrName,
|
||||
+ stateAfterName: tAfterName,
|
||||
+ stateBeforeValue: tBeforeValue,
|
||||
+ stateHTMLCmt: tHTMLCmt,
|
||||
+ stateRCDATA: tSpecialTagEnd,
|
||||
+ stateAttr: tAttr,
|
||||
+ stateURL: tURL,
|
||||
+ stateSrcset: tURL,
|
||||
+ stateJS: tJS,
|
||||
+ stateJSDqStr: tJSDelimited,
|
||||
+ stateJSSqStr: tJSDelimited,
|
||||
+ stateJSBqStr: tJSDelimited,
|
||||
+ stateJSRegexp: tJSDelimited,
|
||||
+ stateJSBlockCmt: tBlockCmt,
|
||||
+ stateJSLineCmt: tLineCmt,
|
||||
+ stateJSHTMLOpenCmt: tLineCmt,
|
||||
+ stateJSHTMLCloseCmt: tLineCmt,
|
||||
+ stateCSS: tCSS,
|
||||
+ stateCSSDqStr: tCSSStr,
|
||||
+ stateCSSSqStr: tCSSStr,
|
||||
+ stateCSSDqURL: tCSSStr,
|
||||
+ stateCSSSqURL: tCSSStr,
|
||||
+ stateCSSURL: tCSSStr,
|
||||
+ stateCSSBlockCmt: tBlockCmt,
|
||||
+ stateCSSLineCmt: tLineCmt,
|
||||
+ stateError: tError,
|
||||
}
|
||||
|
||||
var commentStart = []byte("<!--")
|
||||
@@ -263,7 +265,7 @@ func tURL(c context, s []byte) (context, int) {
|
||||
|
||||
// tJS is the context transition function for the JS state.
|
||||
func tJS(c context, s []byte) (context, int) {
|
||||
- i := bytes.IndexAny(s, "\"`'/")
|
||||
+ i := bytes.IndexAny(s, "\"`'/<-#")
|
||||
if i == -1 {
|
||||
// Entire input is non string, comment, regexp tokens.
|
||||
c.jsCtx = nextJSCtx(s, c.jsCtx)
|
||||
@@ -293,6 +295,26 @@ func tJS(c context, s []byte) (context, int) {
|
||||
err: errorf(ErrSlashAmbig, nil, 0, "'/' could start a division or regexp: %.32q", s[i:]),
|
||||
}, len(s)
|
||||
}
|
||||
+ // ECMAScript supports HTML style comments for legacy reasons, see Appendix
|
||||
+ // B.1.1 "HTML-like Comments". The handling of these comments is somewhat
|
||||
+ // confusing. Multi-line comments are not supported, i.e. anything on lines
|
||||
+ // between the opening and closing tokens is not considered a comment, but
|
||||
+ // anything following the opening or closing token, on the same line, is
|
||||
+ // ignored. As such we simply treat any line prefixed with "<!--" or "-->"
|
||||
+ // as if it were actually prefixed with "//" and move on.
|
||||
+ case '<':
|
||||
+ if i+3 < len(s) && bytes.Equal(commentStart, s[i:i+4]) {
|
||||
+ c.state, i = stateJSHTMLOpenCmt, i+3
|
||||
+ }
|
||||
+ case '-':
|
||||
+ if i+2 < len(s) && bytes.Equal(commentEnd, s[i:i+3]) {
|
||||
+ c.state, i = stateJSHTMLCloseCmt, i+2
|
||||
+ }
|
||||
+ // ECMAScript also supports "hashbang" comment lines, see Section 12.5.
|
||||
+ case '#':
|
||||
+ if i+1 < len(s) && s[i+1] == '!' {
|
||||
+ c.state, i = stateJSLineCmt, i+1
|
||||
+ }
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
@@ -372,12 +394,12 @@ func tBlockCmt(c context, s []byte) (context, int) {
|
||||
return c, i + 2
|
||||
}
|
||||
|
||||
-// tLineCmt is the context transition function for //comment states.
|
||||
+// tLineCmt is the context transition function for //comment states, and the JS HTML-like comment state.
|
||||
func tLineCmt(c context, s []byte) (context, int) {
|
||||
var lineTerminators string
|
||||
var endState state
|
||||
switch c.state {
|
||||
- case stateJSLineCmt:
|
||||
+ case stateJSLineCmt, stateJSHTMLOpenCmt, stateJSHTMLCloseCmt:
|
||||
lineTerminators, endState = "\n\r\u2028\u2029", stateJS
|
||||
case stateCSSLineCmt:
|
||||
lineTerminators, endState = "\n\f\r", stateCSS
|
||||
--
|
||||
2.33.0
|
||||
259
0051-Backport-html-template-properly-handle-special-tags-.patch
Normal file
259
0051-Backport-html-template-properly-handle-special-tags-.patch
Normal file
@ -0,0 +1,259 @@
|
||||
From 015ed76f8637206669be945cb7d1c4315b5a0110 Mon Sep 17 00:00:00 2001
|
||||
From: Roland Shoemaker <bracewell@google.com>
|
||||
Date: Thu, 3 Aug 2023 12:28:28 -0700
|
||||
Subject: [PATCH 2/2] [Backport] html/template: properly handle special tags
|
||||
within the script context
|
||||
|
||||
Reference: https://open.codehub.huawei.com/OpenSourceCenter/golang/go/merge_requests/94
|
||||
Conflict: NA
|
||||
|
||||
The HTML specification has incredibly complex rules for how to handle
|
||||
"<!--", "<script", and "</script" when they appear within literals in
|
||||
the script context. Rather than attempting to apply these restrictions
|
||||
(which require a significantly more complex state machine) we apply
|
||||
the workaround suggested in section 4.12.1.3 of the HTML specification [1].
|
||||
|
||||
More precisely, when "<!--", "<script", and "</script" appear within
|
||||
literals (strings and regular expressions, ignoring comments since we
|
||||
already elide their content) we replace the "<" with "\x3C". This avoids
|
||||
the unintuitive behavior that using these tags within literals can cause,
|
||||
by simply preventing the rendered content from triggering it. This may
|
||||
break some correct usages of these tags, but on balance is more likely
|
||||
to prevent XSS attacks where users are unknowingly either closing or not
|
||||
closing the script blocks where they think they are.
|
||||
|
||||
Thanks to Takeshi Kaneko (GMO Cybersecurity by Ierae, Inc.) for
|
||||
reporting this issue.
|
||||
|
||||
Note: The upstream does not submit this change to go1.17 according to the rules of MinorReleases.
|
||||
Corego3.x are based on go1.17.8. Therefore, it need to submit the change to corego3.x.
|
||||
|
||||
Edited-by: machangwang m00509938
|
||||
|
||||
Fixes #62197
|
||||
Fixes #62397
|
||||
Fixes CVE-2023-39319
|
||||
|
||||
[1] https://html.spec.whatwg.org/#restrictions-for-contents-of-script-elements
|
||||
|
||||
Change-Id: Iab57b0532694827e3eddf57a7497ba1fab1746dc
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1976594
|
||||
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2014621
|
||||
TryBot-Result: Security TryBots <security-trybots@go-security-trybots.iam.gserviceaccount.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/526099
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
Run-TryBot: Cherry Mui <cherryyz@google.com>
|
||||
|
||||
Signed-off-by: Ma Chang Wang machangwang@huawei.com
|
||||
---
|
||||
src/go/build/deps_test.go | 6 ++--
|
||||
src/html/template/context.go | 14 ++++++++++
|
||||
src/html/template/escape.go | 26 ++++++++++++++++++
|
||||
src/html/template/escape_test.go | 47 +++++++++++++++++++++++++++++++-
|
||||
src/html/template/transition.go | 15 ++++++++++
|
||||
5 files changed, 104 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go
|
||||
index 610fba2da9..e56cd587ff 100644
|
||||
--- a/src/go/build/deps_test.go
|
||||
+++ b/src/go/build/deps_test.go
|
||||
@@ -255,15 +255,15 @@ var depsRules = `
|
||||
< text/template
|
||||
< internal/lazytemplate;
|
||||
|
||||
- encoding/json, html, text/template
|
||||
- < html/template;
|
||||
-
|
||||
# regexp
|
||||
FMT
|
||||
< regexp/syntax
|
||||
< regexp
|
||||
< internal/lazyregexp;
|
||||
|
||||
+ encoding/json, html, text/template, regexp
|
||||
+ < html/template;
|
||||
+
|
||||
# suffix array
|
||||
encoding/binary, regexp
|
||||
< index/suffixarray;
|
||||
diff --git a/src/html/template/context.go b/src/html/template/context.go
|
||||
index 472b5a9772..8c3cc4709e 100644
|
||||
--- a/src/html/template/context.go
|
||||
+++ b/src/html/template/context.go
|
||||
@@ -170,6 +170,20 @@ func isInTag(s state) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
+// isInScriptLiteral returns true if s is one of the literal states within a
|
||||
+// <script> tag, and as such occurances of "<!--", "<script", and "</script"
|
||||
+// need to be treated specially.
|
||||
+func isInScriptLiteral(s state) bool {
|
||||
+ // Ignore the comment states (stateJSBlockCmt, stateJSLineCmt,
|
||||
+ // stateJSHTMLOpenCmt, stateJSHTMLCloseCmt) because their content is already
|
||||
+ // omitted from the output.
|
||||
+ switch s {
|
||||
+ case stateJSDqStr, stateJSSqStr, stateJSBqStr, stateJSRegexp:
|
||||
+ return true
|
||||
+ }
|
||||
+ return false
|
||||
+}
|
||||
+
|
||||
// delim is the delimiter that will end the current HTML attribute.
|
||||
type delim uint8
|
||||
|
||||
diff --git a/src/html/template/escape.go b/src/html/template/escape.go
|
||||
index 3249c67008..b0085ceccc 100644
|
||||
--- a/src/html/template/escape.go
|
||||
+++ b/src/html/template/escape.go
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"html"
|
||||
"internal/godebug"
|
||||
"io"
|
||||
+ "regexp"
|
||||
"text/template"
|
||||
"text/template/parse"
|
||||
)
|
||||
@@ -652,6 +653,26 @@ var delimEnds = [...]string{
|
||||
delimSpaceOrTagEnd: " \t\n\f\r>",
|
||||
}
|
||||
|
||||
+var (
|
||||
+ // Per WHATWG HTML specification, section 4.12.1.3, there are extremely
|
||||
+ // complicated rules for how to handle the set of opening tags <!--,
|
||||
+ // <script, and </script when they appear in JS literals (i.e. strings,
|
||||
+ // regexs, and comments). The specification suggests a simple solution,
|
||||
+ // rather than implementing the arcane ABNF, which involves simply escaping
|
||||
+ // the opening bracket with \x3C. We use the below regex for this, since it
|
||||
+ // makes doing the case-insensitive find-replace much simpler.
|
||||
+ specialScriptTagRE = regexp.MustCompile("(?i)<(script|/script|!--)")
|
||||
+ specialScriptTagReplacement = []byte("\\x3C$1")
|
||||
+)
|
||||
+
|
||||
+func containsSpecialScriptTag(s []byte) bool {
|
||||
+ return specialScriptTagRE.Match(s)
|
||||
+}
|
||||
+
|
||||
+func escapeSpecialScriptTags(s []byte) []byte {
|
||||
+ return specialScriptTagRE.ReplaceAll(s, specialScriptTagReplacement)
|
||||
+}
|
||||
+
|
||||
var doctypeBytes = []byte("<!DOCTYPE")
|
||||
|
||||
// escapeText escapes a text template node.
|
||||
@@ -710,6 +731,11 @@ func (e *escaper) escapeText(c context, n *parse.TextNode) context {
|
||||
b.Write(s[written:cs])
|
||||
written = i1
|
||||
}
|
||||
+ if isInScriptLiteral(c.state) && containsSpecialScriptTag(s[i:i1]) {
|
||||
+ b.Write(s[written:i])
|
||||
+ b.Write(escapeSpecialScriptTags(s[i:i1]))
|
||||
+ written = i1
|
||||
+ }
|
||||
if i == i1 && c.state == c1.state {
|
||||
panic(fmt.Sprintf("infinite loop from %v to %v on %q..%q", c, c1, s[:i], s[i:]))
|
||||
}
|
||||
diff --git a/src/html/template/escape_test.go b/src/html/template/escape_test.go
|
||||
index e38888a13f..2f9f4c21f0 100644
|
||||
--- a/src/html/template/escape_test.go
|
||||
+++ b/src/html/template/escape_test.go
|
||||
@@ -513,6 +513,21 @@ func TestEscape(t *testing.T) {
|
||||
"<script>#! beep\n</script>",
|
||||
"<script>\n</script>",
|
||||
},
|
||||
+ {
|
||||
+ "Special tags in <script> string literals",
|
||||
+ `<script>var a = "asd < 123 <!-- 456 < fgh <script jkl < 789 </script"</script>`,
|
||||
+ `<script>var a = "asd < 123 \x3C!-- 456 < fgh \x3Cscript jkl < 789 \x3C/script"</script>`,
|
||||
+ },
|
||||
+ {
|
||||
+ "Special tags in <script> string literals (mixed case)",
|
||||
+ `<script>var a = "<!-- <ScripT </ScripT"</script>`,
|
||||
+ `<script>var a = "\x3C!-- \x3CScripT \x3C/ScripT"</script>`,
|
||||
+ },
|
||||
+ {
|
||||
+ "Special tags in <script> regex literals (mixed case)",
|
||||
+ `<script>var a = /<!-- <ScripT </ScripT/</script>`,
|
||||
+ `<script>var a = /\x3C!-- \x3CScripT \x3C/ScripT/</script>`,
|
||||
+ },
|
||||
{
|
||||
"CSS comments",
|
||||
"<style>p// paragraph\n" +
|
||||
@@ -1509,8 +1524,38 @@ func TestEscapeText(t *testing.T) {
|
||||
context{state: stateJS, element: elementScript},
|
||||
},
|
||||
{
|
||||
+ // <script and </script tags are escaped, so </script> should not
|
||||
+ // cause us to exit the JS state.
|
||||
`<script>document.write("<script>alert(1)</script>");`,
|
||||
- context{state: stateText},
|
||||
+ context{state: stateJS, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>document.write("<script>`,
|
||||
+ context{state: stateJSDqStr, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>document.write("<script>alert(1)</script>`,
|
||||
+ context{state: stateJSDqStr, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>document.write("<script>alert(1)<!--`,
|
||||
+ context{state: stateJSDqStr, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>document.write("<script>alert(1)</Script>");`,
|
||||
+ context{state: stateJS, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>document.write("<!--");`,
|
||||
+ context{state: stateJS, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>let a = /</script`,
|
||||
+ context{state: stateJSRegexp, element: elementScript},
|
||||
+ },
|
||||
+ {
|
||||
+ `<script>let a = /</script/`,
|
||||
+ context{state: stateJS, element: elementScript, jsCtx: jsCtxDivOp},
|
||||
},
|
||||
{
|
||||
`<script type="text/template">`,
|
||||
diff --git a/src/html/template/transition.go b/src/html/template/transition.go
|
||||
index 12aa4c41fe..3d2a37cdd9 100644
|
||||
--- a/src/html/template/transition.go
|
||||
+++ b/src/html/template/transition.go
|
||||
@@ -214,6 +214,11 @@ var (
|
||||
// element states.
|
||||
func tSpecialTagEnd(c context, s []byte) (context, int) {
|
||||
if c.element != elementNone {
|
||||
+ // script end tags ("</script") within script literals are ignored, so that
|
||||
+ // we can properly escape them.
|
||||
+ if c.element == elementScript && (isInScriptLiteral(c.state) || isComment(c.state)) {
|
||||
+ return c, len(s)
|
||||
+ }
|
||||
if i := indexTagEnd(s, specialTagEndMarkers[c.element]); i != -1 {
|
||||
return context{}, i
|
||||
}
|
||||
@@ -353,6 +358,16 @@ func tJSDelimited(c context, s []byte) (context, int) {
|
||||
inCharset = true
|
||||
case ']':
|
||||
inCharset = false
|
||||
+ case '/':
|
||||
+ // If "</script" appears in a regex literal, the '/' should not
|
||||
+ // close the regex literal, and it will later be escaped to
|
||||
+ // "\x3C/script" in escapeText.
|
||||
+ if i > 0 && i+7 <= len(s) && bytes.Compare(bytes.ToLower(s[i-1:i+7]), []byte("</script")) == 0 {
|
||||
+ i++
|
||||
+ } else if !inCharset {
|
||||
+ c.state, c.jsCtx = stateJS, jsCtxDivOp
|
||||
+ return c, i + 1
|
||||
+ }
|
||||
default:
|
||||
// end delimiter
|
||||
if !inCharset {
|
||||
--
|
||||
2.33.0
|
||||
140
0052-Backport-cmd-compile-use-absolute-file-name-in-isCgo.patch
Normal file
140
0052-Backport-cmd-compile-use-absolute-file-name-in-isCgo.patch
Normal file
@ -0,0 +1,140 @@
|
||||
From a56df8ee0ed2cd76c939f916d5f72f281f902f7c Mon Sep 17 00:00:00 2001
|
||||
From: Ian Lance Taylor <iant@golang.org>
|
||||
Date: Thu, 21 Sep 2023 07:16:29 +0800
|
||||
Subject: [PATCH] [Backport] cmd/compile: use absolute file name in isCgo check
|
||||
|
||||
Offering: Cloud Core Network
|
||||
CVE: CVE-2023-39323
|
||||
Reference: https://go-review.googlesource.com/c/go/+/533195
|
||||
|
||||
Note: The upstream does not submit this change to go1.17 according to the rules of MinorReleases.
|
||||
Corego3.x are based on go1.17.8. Therefore, it need to submit the change to corego3.x.
|
||||
|
||||
Edited-by: machangwang m00509938
|
||||
|
||||
For #23672
|
||||
Updates #63211
|
||||
Fixes #63213
|
||||
Fixes CVE-2023-39323
|
||||
|
||||
Change-Id: I4586a69e1b2560036afec29d53e53cf25e6c7352
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2032884
|
||||
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
(cherry picked from commit 9b19e751918dd218035811b1ef83a8c2693b864a)
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2037629
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/533195
|
||||
Auto-Submit: Michael Pratt <mpratt@google.com>
|
||||
Reviewed-by: Ian Lance Taylor <iant@google.com>
|
||||
TryBot-Bypass: Michael Pratt <mpratt@google.com>
|
||||
Reviewed-by: Than McIntosh <thanm@google.com>
|
||||
Signed-off-by: Ma Chang Wang machangwang@huawei.com
|
||||
---
|
||||
misc/cgo/errors/errors_test.go | 32 ++++++++++++++++++-------
|
||||
misc/cgo/errors/testdata/err5.go | 11 +++++++++
|
||||
src/cmd/compile/internal/noder/noder.go | 8 ++++++-
|
||||
3 files changed, 41 insertions(+), 10 deletions(-)
|
||||
create mode 100644 misc/cgo/errors/testdata/err5.go
|
||||
|
||||
diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go
|
||||
index 68a30a44fe..dd60a98e8e 100644
|
||||
--- a/misc/cgo/errors/errors_test.go
|
||||
+++ b/misc/cgo/errors/errors_test.go
|
||||
@@ -20,6 +20,13 @@ func path(file string) string {
|
||||
return filepath.Join("testdata", file)
|
||||
}
|
||||
|
||||
+func bytesCut(s, sep []byte) (before, after []byte, found bool) {
|
||||
+ if i := bytes.Index(s, sep); i >= 0 {
|
||||
+ return s[:i], s[i+len(sep):], true
|
||||
+ }
|
||||
+ return s, nil, false
|
||||
+}
|
||||
+
|
||||
func check(t *testing.T, file string) {
|
||||
t.Run(file, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
@@ -36,17 +43,23 @@ func check(t *testing.T, file string) {
|
||||
continue
|
||||
}
|
||||
|
||||
- frags := bytes.SplitAfterN(line, []byte("ERROR HERE: "), 2)
|
||||
- if len(frags) == 1 {
|
||||
- continue
|
||||
+ if _, frag, ok := bytesCut(line, []byte("ERROR HERE: ")); ok {
|
||||
+ re, err := regexp.Compile(fmt.Sprintf(":%d:.*%s", i+1, frag))
|
||||
+ if err != nil {
|
||||
+ t.Errorf("Invalid regexp after `ERROR HERE: `: %#q", frag)
|
||||
+ continue
|
||||
+ }
|
||||
+ errors = append(errors, re)
|
||||
}
|
||||
- frag := fmt.Sprintf(":%d:.*%s", i+1, frags[1])
|
||||
- re, err := regexp.Compile(frag)
|
||||
- if err != nil {
|
||||
- t.Errorf("Invalid regexp after `ERROR HERE: `: %#q", frags[1])
|
||||
- continue
|
||||
+
|
||||
+ if _, frag, ok := bytesCut(line, []byte("ERROR MESSAGE: ")); ok {
|
||||
+ re, err := regexp.Compile(string(frag))
|
||||
+ if err != nil {
|
||||
+ t.Errorf("Invalid regexp after `ERROR MESSAGE: `: %#q", frag)
|
||||
+ continue
|
||||
+ }
|
||||
+ errors = append(errors, re)
|
||||
}
|
||||
- errors = append(errors, re)
|
||||
}
|
||||
if len(errors) == 0 {
|
||||
t.Fatalf("cannot find ERROR HERE")
|
||||
@@ -107,6 +120,7 @@ func TestReportsTypeErrors(t *testing.T) {
|
||||
for _, file := range []string{
|
||||
"err1.go",
|
||||
"err2.go",
|
||||
+ "err5.go",
|
||||
"issue11097a.go",
|
||||
"issue11097b.go",
|
||||
"issue18452.go",
|
||||
diff --git a/misc/cgo/errors/testdata/err5.go b/misc/cgo/errors/testdata/err5.go
|
||||
new file mode 100644
|
||||
index 0000000000..c12a290d38
|
||||
--- /dev/null
|
||||
+++ b/misc/cgo/errors/testdata/err5.go
|
||||
@@ -0,0 +1,11 @@
|
||||
+// Copyright 2023 The Go Authors. All rights reserved.
|
||||
+// Use of this source code is governed by a BSD-style
|
||||
+// license that can be found in the LICENSE file.
|
||||
+
|
||||
+package main
|
||||
+
|
||||
+//line /tmp/_cgo_.go:1
|
||||
+//go:cgo_dynamic_linker "/elf/interp"
|
||||
+// ERROR MESSAGE: only allowed in cgo-generated code
|
||||
+
|
||||
+func main() {}
|
||||
diff --git a/src/cmd/compile/internal/noder/noder.go b/src/cmd/compile/internal/noder/noder.go
|
||||
index 5fcad096c2..b802d22bc1 100644
|
||||
--- a/src/cmd/compile/internal/noder/noder.go
|
||||
+++ b/src/cmd/compile/internal/noder/noder.go
|
||||
@@ -1690,8 +1690,14 @@ func (p *noder) pragma(pos syntax.Pos, blankLine bool, text string, old syntax.P
|
||||
// contain cgo directives, and for security reasons
|
||||
// (primarily misuse of linker flags), other files are not.
|
||||
// See golang.org/issue/23672.
|
||||
+// Note that cmd/go ignores files whose names start with underscore,
|
||||
+// so the only _cgo_ files we will see from cmd/go are generated by cgo.
|
||||
+// It's easy to bypass this check by calling the compiler directly;
|
||||
+// we only protect against uses by cmd/go.
|
||||
func isCgoGeneratedFile(pos syntax.Pos) bool {
|
||||
- return strings.HasPrefix(filepath.Base(filepath.Clean(fileh(pos.Base().Filename()))), "_cgo_")
|
||||
+ // We need the absolute file, independent of //line directives,
|
||||
+ // so we call pos.Base().Pos().
|
||||
+ return strings.HasPrefix(filepath.Base(filepath.Clean(fileh(pos.Base().Pos().Base().Filename()))), "_cgo_")
|
||||
}
|
||||
|
||||
// safeArg reports whether arg is a "safe" command-line argument,
|
||||
--
|
||||
2.28.0.windows.1
|
||||
|
||||
147
0053-CVE-2023-39325-net-http-regenerate-h2_bundle.go.patch
Normal file
147
0053-CVE-2023-39325-net-http-regenerate-h2_bundle.go.patch
Normal file
@ -0,0 +1,147 @@
|
||||
From 6dc693737f84785a30238ca7640ad8ba605c0eac Mon Sep 17 00:00:00 2001
|
||||
From: Damien Neil <dneil@google.com>
|
||||
Date: Sat, 7 Oct 2023 05:16:27 +0800
|
||||
Subject: [PATCH] [Backport] net/http: regenerate h2_bundle.go
|
||||
|
||||
Offering: Cloud Core Network
|
||||
CVE: CVE-2023-39325
|
||||
Reference: https://go-review.googlesource.com/c/go/+/534255
|
||||
|
||||
Pull in a security fix from x/net/http2:
|
||||
http2: limit maximum handler goroutines to MaxConcurrentStreamso
|
||||
|
||||
Note: The upstream does not submit this change to go1.17 according to the rules of MinorReleases.
|
||||
Corego3.x are based on go1.17.8. Therefore, it need to submit the change to corego3.x.
|
||||
|
||||
Edited-by: machangwang m00509938
|
||||
|
||||
For #63417
|
||||
Fixes #63426
|
||||
Fixes CVE-2023-39325
|
||||
|
||||
Change-Id: I6e32397323cd9b4114c990fcc9d19557a7f5f619
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2047401
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
TryBot-Result: Security TryBots <security-trybots@go-security-trybots.iam.gserviceaccount.com>
|
||||
Run-TryBot: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Ian Cottrell <iancottrell@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/534255
|
||||
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
TryBot-Bypass: Dmitri Shuralyov <dmitshur@google.com>
|
||||
Reviewed-by: Michael Pratt <mpratt@google.com>
|
||||
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
|
||||
Signed-off-by: Ma Chang Wang machangwang@huawei.com
|
||||
---
|
||||
src/net/http/h2_bundle.go | 62 +++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 60 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go
|
||||
index 5433ebdc51..b87d14b6ea 100644
|
||||
--- a/src/net/http/h2_bundle.go
|
||||
+++ b/src/net/http/h2_bundle.go
|
||||
@@ -4181,9 +4181,11 @@ type http2serverConn struct {
|
||||
advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
|
||||
curClientStreams uint32 // number of open streams initiated by the client
|
||||
curPushedStreams uint32 // number of open streams initiated by server push
|
||||
+ curHandlers uint32 // number of running handler goroutines
|
||||
maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests
|
||||
maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes
|
||||
streams map[uint32]*http2stream
|
||||
+ unstartedHandlers []http2unstartedHandler
|
||||
initialStreamSendWindowSize int32
|
||||
maxFrameSize int32
|
||||
headerTableSize uint32
|
||||
@@ -4577,6 +4579,8 @@ func (sc *http2serverConn) serve() {
|
||||
return
|
||||
case http2gracefulShutdownMsg:
|
||||
sc.startGracefulShutdownInternal()
|
||||
+ case http2handlerDoneMsg:
|
||||
+ sc.handlerDone()
|
||||
default:
|
||||
panic("unknown timer")
|
||||
}
|
||||
@@ -4622,6 +4626,7 @@ var (
|
||||
http2idleTimerMsg = new(http2serverMessage)
|
||||
http2shutdownTimerMsg = new(http2serverMessage)
|
||||
http2gracefulShutdownMsg = new(http2serverMessage)
|
||||
+ http2handlerDoneMsg = new(http2serverMessage)
|
||||
)
|
||||
|
||||
func (sc *http2serverConn) onSettingsTimer() { sc.sendServeMsg(http2settingsTimerMsg) }
|
||||
@@ -5584,8 +5589,7 @@ func (sc *http2serverConn) processHeaders(f *http2MetaHeadersFrame) error {
|
||||
sc.conn.SetReadDeadline(time.Time{})
|
||||
}
|
||||
|
||||
- go sc.runHandler(rw, req, handler)
|
||||
- return nil
|
||||
+ return sc.scheduleHandler(id, rw, req, handler)
|
||||
}
|
||||
|
||||
func (st *http2stream) processTrailerHeaders(f *http2MetaHeadersFrame) error {
|
||||
@@ -5832,8 +5836,62 @@ func (sc *http2serverConn) newWriterAndRequestNoBody(st *http2stream, rp http2re
|
||||
return rw, req, nil
|
||||
}
|
||||
|
||||
+type http2unstartedHandler struct {
|
||||
+ streamID uint32
|
||||
+ rw *http2responseWriter
|
||||
+ req *Request
|
||||
+ handler func(ResponseWriter, *Request)
|
||||
+}
|
||||
+
|
||||
+// scheduleHandler starts a handler goroutine,
|
||||
+// or schedules one to start as soon as an existing handler finishes.
|
||||
+func (sc *http2serverConn) scheduleHandler(streamID uint32, rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) error {
|
||||
+ sc.serveG.check()
|
||||
+ maxHandlers := sc.advMaxStreams
|
||||
+ if sc.curHandlers < maxHandlers {
|
||||
+ sc.curHandlers++
|
||||
+ go sc.runHandler(rw, req, handler)
|
||||
+ return nil
|
||||
+ }
|
||||
+ if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) {
|
||||
+ return http2ConnectionError(http2ErrCodeEnhanceYourCalm)
|
||||
+ }
|
||||
+ sc.unstartedHandlers = append(sc.unstartedHandlers, http2unstartedHandler{
|
||||
+ streamID: streamID,
|
||||
+ rw: rw,
|
||||
+ req: req,
|
||||
+ handler: handler,
|
||||
+ })
|
||||
+ return nil
|
||||
+}
|
||||
+
|
||||
+func (sc *http2serverConn) handlerDone() {
|
||||
+ sc.serveG.check()
|
||||
+ sc.curHandlers--
|
||||
+ i := 0
|
||||
+ maxHandlers := sc.advMaxStreams
|
||||
+ for ; i < len(sc.unstartedHandlers); i++ {
|
||||
+ u := sc.unstartedHandlers[i]
|
||||
+ if sc.streams[u.streamID] == nil {
|
||||
+ // This stream was reset before its goroutine had a chance to start.
|
||||
+ continue
|
||||
+ }
|
||||
+ if sc.curHandlers >= maxHandlers {
|
||||
+ break
|
||||
+ }
|
||||
+ sc.curHandlers++
|
||||
+ go sc.runHandler(u.rw, u.req, u.handler)
|
||||
+ sc.unstartedHandlers[i] = http2unstartedHandler{} // don't retain references
|
||||
+ }
|
||||
+ sc.unstartedHandlers = sc.unstartedHandlers[i:]
|
||||
+ if len(sc.unstartedHandlers) == 0 {
|
||||
+ sc.unstartedHandlers = nil
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
// Run on its own goroutine.
|
||||
func (sc *http2serverConn) runHandler(rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) {
|
||||
+ defer sc.sendServeMsg(http2handlerDoneMsg)
|
||||
didPanic := true
|
||||
defer func() {
|
||||
rw.rws.stream.cancelCtx()
|
||||
--
|
||||
2.33.0
|
||||
|
||||
31
golang.spec
31
golang.spec
@ -63,7 +63,7 @@
|
||||
|
||||
Name: golang
|
||||
Version: 1.17.3
|
||||
Release: 21
|
||||
Release: 25
|
||||
Summary: The Go Programming Language
|
||||
License: BSD and Public Domain
|
||||
URL: https://golang.org/
|
||||
@ -198,6 +198,11 @@ Patch6045: 0045-Backport-cmd-go-enforce-flags-with-non-optional-argu.patch
|
||||
Patch6046: 0046-Backport-cmd-go-cmd-cgo-in-_cgo_flags-use-one-line-p.patch
|
||||
Patch6047: 0047-Backport-net-http-validate-Host-header-before-sendin.patch
|
||||
Patch6048: 0048-Backport-net-http-permit-requests-with-invalid-Host-headers.patch
|
||||
Patch6049: 0049-Backport-crypto-tls-restrict-RSA-keys-in-certificates-to-8192.patch
|
||||
Patch6050: 0050-Backport-html-template-support-HTML-like-comments-in.patch
|
||||
Patch6051: 0051-Backport-html-template-properly-handle-special-tags-.patch
|
||||
Patch6052: 0052-Backport-cmd-compile-use-absolute-file-name-in-isCgo.patch
|
||||
Patch6053: 0053-CVE-2023-39325-net-http-regenerate-h2_bundle.go.patch
|
||||
|
||||
ExclusiveArch: %{golang_arches}
|
||||
|
||||
@ -436,6 +441,30 @@ fi
|
||||
%files devel -f go-tests.list -f go-misc.list -f go-src.list
|
||||
|
||||
%changelog
|
||||
* Mon Oct 23 2023 hanchao <hanchao63@huawei.com> - 1.17.3-25
|
||||
- Type:CVE
|
||||
- CVE:CVE-2023-39325
|
||||
- SUG:NA
|
||||
- DESC:fix CVE-2023-39325
|
||||
|
||||
* Fri Oct 13 2023 luoyujie <luoyujie5@huawei.com> - 1.17.3-24
|
||||
- Type:CVE
|
||||
- CVE:CVE-2023-39323
|
||||
- SUG:NA
|
||||
- DESC:fix CVE-2023-39323
|
||||
|
||||
* Mon Sep 25 2023 luoyujie <luoyujie5@huawei.com> - 1.17.3-23
|
||||
- Type:CVE
|
||||
- CVE:CVE-2023-39318,CVE-2023-39319
|
||||
- SUG:NA
|
||||
- DESC:fix CVE-2023-39318 and CVE-2023-39319
|
||||
|
||||
* Fri Aug 25 2023 luoyujie <luoyujie5@huawei.com> - 1.17.3-22
|
||||
- Type:CVE
|
||||
- CVE:CVE-2023-29409
|
||||
- SUG:NA
|
||||
- DESC:fix CVE-2023-29409
|
||||
|
||||
* Fri Aug 25 2023 sunchendong <sunchendong@xfusion.com> - 1.17.3-21
|
||||
- permit invalid host header for docker
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user