import golang-1.16.7-1.module+el8.5.0+12246+1aac4e3f
This commit is contained in:
parent
7061b2ef39
commit
cc55b2ba52
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/go-go-1.15.7-1-openssl-fips.tar.gz
|
SOURCES/go-go-1.16.7-1-openssl-fips.tar.gz
|
||||||
|
@ -1 +1 @@
|
|||||||
501d01d764310874ec20f3d7555c70948ef15fb2 SOURCES/go-go-1.15.7-1-openssl-fips.tar.gz
|
e693273f254789980a55720bd48ac8741d446f21 SOURCES/go-go-1.16.7-1-openssl-fips.tar.gz
|
||||||
|
235
SOURCES/fix-crypto-memory-leaks.patch
Normal file
235
SOURCES/fix-crypto-memory-leaks.patch
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
diff --git a/src/crypto/internal/boring/goopenssl.h b/src/crypto/internal/boring/goopenssl.h
|
||||||
|
index 3585458..ae1607b 100644
|
||||||
|
--- a/src/crypto/internal/boring/goopenssl.h
|
||||||
|
+++ b/src/crypto/internal/boring/goopenssl.h
|
||||||
|
@@ -667,6 +667,7 @@ typedef EVP_PKEY GO_EVP_PKEY;
|
||||||
|
DEFINEFUNC(GO_EVP_PKEY *, EVP_PKEY_new, (void), ())
|
||||||
|
DEFINEFUNC(void, EVP_PKEY_free, (GO_EVP_PKEY * arg0), (arg0))
|
||||||
|
DEFINEFUNC(int, EVP_PKEY_set1_RSA, (GO_EVP_PKEY * arg0, GO_RSA *arg1), (arg0, arg1))
|
||||||
|
+DEFINEFUNC(int, EVP_PKEY_set1_EC_KEY, (GO_EVP_PKEY * arg0, GO_EC_KEY *arg1), (arg0, arg1))
|
||||||
|
DEFINEFUNC(int, EVP_PKEY_verify,
|
||||||
|
(EVP_PKEY_CTX *ctx, const unsigned char *sig, unsigned int siglen, const unsigned char *tbs, size_t tbslen),
|
||||||
|
(ctx, sig, siglen, tbs, tbslen))
|
||||||
|
diff --git a/src/crypto/internal/boring/openssl_ecdsa_signature.c b/src/crypto/internal/boring/openssl_ecdsa_signature.c
|
||||||
|
index 4c14cc9..daa1252 100644
|
||||||
|
--- a/src/crypto/internal/boring/openssl_ecdsa_signature.c
|
||||||
|
+++ b/src/crypto/internal/boring/openssl_ecdsa_signature.c
|
||||||
|
@@ -9,19 +9,32 @@
|
||||||
|
int
|
||||||
|
_goboringcrypto_ECDSA_sign(EVP_MD* md, const uint8_t *msg, size_t msgLen, uint8_t *sig, unsigned int *slen, GO_EC_KEY *eckey)
|
||||||
|
{
|
||||||
|
+ int result;
|
||||||
|
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
- if (!_goboringcrypto_EVP_PKEY_assign_EC_KEY(key, eckey))
|
||||||
|
- return 0;
|
||||||
|
- return _goboringcrypto_EVP_sign(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+ if (!_goboringcrypto_EVP_PKEY_set1_EC_KEY(key, eckey)) {
|
||||||
|
+ result = 0;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+ result = _goboringcrypto_EVP_sign(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+err:
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(key);
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_goboringcrypto_ECDSA_verify(EVP_MD* md, const uint8_t *msg, size_t msgLen, const uint8_t *sig, unsigned int slen, GO_EC_KEY *eckey)
|
||||||
|
{
|
||||||
|
|
||||||
|
+ int result;
|
||||||
|
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
- if (!_goboringcrypto_EVP_PKEY_assign_EC_KEY(key, eckey))
|
||||||
|
- return 0;
|
||||||
|
+ if (!_goboringcrypto_EVP_PKEY_set1_EC_KEY(key, eckey)) {
|
||||||
|
+ result = 0;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- return _goboringcrypto_EVP_verify(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+ result = _goboringcrypto_EVP_verify(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+
|
||||||
|
+err:
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(key);
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
diff --git a/src/crypto/internal/boring/openssl_port_rsa.c b/src/crypto/internal/boring/openssl_port_rsa.c
|
||||||
|
index a8d047d..2e56499 100644
|
||||||
|
--- a/src/crypto/internal/boring/openssl_port_rsa.c
|
||||||
|
+++ b/src/crypto/internal/boring/openssl_port_rsa.c
|
||||||
|
@@ -25,14 +25,13 @@ int _goboringcrypto_RSA_digest_and_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_
|
||||||
|
EVP_PKEY_CTX *ctx;
|
||||||
|
unsigned int siglen;
|
||||||
|
|
||||||
|
+ int ret = 0;
|
||||||
|
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
- if (!_goboringcrypto_EVP_PKEY_assign_RSA(key, rsa))
|
||||||
|
- return 0;
|
||||||
|
+ if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa))
|
||||||
|
+ goto err;
|
||||||
|
ctx = _goboringcrypto_EVP_PKEY_CTX_new(key, NULL /* no engine */);
|
||||||
|
if (!ctx)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- int ret = 0;
|
||||||
|
+ goto err;
|
||||||
|
|
||||||
|
EVP_MD_CTX *mdctx = NULL;
|
||||||
|
if (!(mdctx = _goboringcrypto_EVP_MD_CTX_create()))
|
||||||
|
@@ -67,6 +66,10 @@ int _goboringcrypto_RSA_digest_and_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_
|
||||||
|
err:
|
||||||
|
if (mdctx)
|
||||||
|
_goboringcrypto_EVP_MD_CTX_free(mdctx);
|
||||||
|
+ if (ctx)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_CTX_free(ctx);
|
||||||
|
+ if (key)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(key);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -78,18 +81,17 @@ int _goboringcrypto_RSA_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_len, uint8_
|
||||||
|
EVP_PKEY *pkey;
|
||||||
|
size_t siglen;
|
||||||
|
|
||||||
|
+ int ret = 0;
|
||||||
|
pkey = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
if (!pkey)
|
||||||
|
- return 0;
|
||||||
|
+ goto err;
|
||||||
|
|
||||||
|
if (_goboringcrypto_EVP_PKEY_set1_RSA(pkey, rsa) <= 0)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
+ goto err;
|
||||||
|
+
|
||||||
|
ctx = _goboringcrypto_EVP_PKEY_CTX_new(pkey, NULL /* no engine */);
|
||||||
|
if (!ctx)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- int ret = 0;
|
||||||
|
+ goto err;
|
||||||
|
|
||||||
|
if (_goboringcrypto_EVP_PKEY_sign_init(ctx) <= 0)
|
||||||
|
goto err;
|
||||||
|
@@ -101,7 +103,7 @@ int _goboringcrypto_RSA_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_len, uint8_
|
||||||
|
goto err;
|
||||||
|
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, mgf1_md) <= 0)
|
||||||
|
goto err;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
/* Determine buffer length */
|
||||||
|
if (_goboringcrypto_EVP_PKEY_sign(ctx, NULL, &siglen, in, in_len) <= 0)
|
||||||
|
goto err;
|
||||||
|
@@ -116,7 +118,10 @@ int _goboringcrypto_RSA_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_len, uint8_
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
|
err:
|
||||||
|
- _goboringcrypto_EVP_PKEY_CTX_free(ctx);
|
||||||
|
+ if (ctx)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_CTX_free(ctx);
|
||||||
|
+ if (pkey)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(pkey);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -130,14 +135,14 @@ int _goboringcrypto_RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *msg, unsigned i
|
||||||
|
|
||||||
|
pkey = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
if (!pkey)
|
||||||
|
- return 0;
|
||||||
|
+ goto err;
|
||||||
|
|
||||||
|
if (_goboringcrypto_EVP_PKEY_set1_RSA(pkey, rsa) <= 0)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
+ goto err;
|
||||||
|
+
|
||||||
|
ctx = _goboringcrypto_EVP_PKEY_CTX_new(pkey, NULL /* no engine */);
|
||||||
|
if (!ctx)
|
||||||
|
- return 0;
|
||||||
|
+ goto err;
|
||||||
|
|
||||||
|
if (_goboringcrypto_EVP_PKEY_verify_init(ctx) <= 0)
|
||||||
|
goto err;
|
||||||
|
@@ -155,25 +160,40 @@ int _goboringcrypto_RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *msg, unsigned i
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
|
err:
|
||||||
|
- _goboringcrypto_EVP_PKEY_CTX_free(ctx);
|
||||||
|
+ if (ctx)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_CTX_free(ctx);
|
||||||
|
+ if (pkey)
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(pkey);
|
||||||
|
+
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _goboringcrypto_EVP_RSA_sign(EVP_MD *md, const uint8_t *msg, unsigned int msgLen, uint8_t *sig, unsigned int *slen, RSA *rsa)
|
||||||
|
{
|
||||||
|
+ int result;
|
||||||
|
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
- if (!_goboringcrypto_EVP_PKEY_assign_RSA(key, rsa))
|
||||||
|
- return 0;
|
||||||
|
- return _goboringcrypto_EVP_sign(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+ if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa)) {
|
||||||
|
+ result = 0;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+ result = _goboringcrypto_EVP_sign(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+err:
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(key);
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _goboringcrypto_EVP_RSA_verify(EVP_MD *md, const uint8_t *msg, unsigned int msgLen, const uint8_t *sig, unsigned int slen, GO_RSA *rsa)
|
||||||
|
{
|
||||||
|
+ int result;
|
||||||
|
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
|
||||||
|
- if (!_goboringcrypto_EVP_PKEY_assign_RSA(key, rsa))
|
||||||
|
- {
|
||||||
|
- return 0;
|
||||||
|
+ if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa)) {
|
||||||
|
+ result = 0;
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
- return _goboringcrypto_EVP_verify(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+ result = _goboringcrypto_EVP_verify(md, NULL, msg, msgLen, sig, slen, key);
|
||||||
|
+err:
|
||||||
|
+ _goboringcrypto_EVP_PKEY_free(key);
|
||||||
|
+ return result;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
diff --git a/src/crypto/internal/boring/rsa.go b/src/crypto/internal/boring/rsa.go
|
||||||
|
index 2eefc27..698c08e 100644
|
||||||
|
--- a/src/crypto/internal/boring/rsa.go
|
||||||
|
+++ b/src/crypto/internal/boring/rsa.go
|
||||||
|
@@ -162,12 +162,23 @@ func setupRSA(withKey func(func(*C.GO_RSA) C.int) C.int,
|
||||||
|
return nil, nil, NewOpenSSLError("EVP_PKEY_set_rsa_oaep_md failed")
|
||||||
|
}
|
||||||
|
// ctx takes ownership of label, so malloc a copy for BoringCrypto to free.
|
||||||
|
- clabel := (*C.uint8_t)(C.malloc(C.size_t(len(label))))
|
||||||
|
- if clabel == nil {
|
||||||
|
- return nil, nil, fail("OPENSSL_malloc")
|
||||||
|
+ var clabel *C.uint8_t
|
||||||
|
+ clabel = nil
|
||||||
|
+ // OpenSSL 1.1.1 does not take ownership of the label if the length is zero.
|
||||||
|
+ // Depending on the malloc implementation, if clabel is allocated with malloc(0),
|
||||||
|
+ // metadata for the size-zero allocation is never cleaned up, which is a memory leak.
|
||||||
|
+ // As such, we must only allocate clabel if the label is of non zero length.
|
||||||
|
+ if len(label) > 0 {
|
||||||
|
+ clabel = (*C.uint8_t)(C.malloc(C.size_t(len(label))))
|
||||||
|
+ if clabel == nil {
|
||||||
|
+ return nil, nil, fail("OPENSSL_malloc")
|
||||||
|
+ }
|
||||||
|
+ copy((*[1 << 30]byte)(unsafe.Pointer(clabel))[:len(label)], label)
|
||||||
|
}
|
||||||
|
- copy((*[1 << 30]byte)(unsafe.Pointer(clabel))[:len(label)], label)
|
||||||
|
- if C._goboringcrypto_EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, clabel, C.int(len(label))) == 0 {
|
||||||
|
+ if C._goboringcrypto_EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, clabel, C.int(len(label))) != 1 {
|
||||||
|
+ if clabel != nil {
|
||||||
|
+ C.free(unsafe.Pointer(clabel))
|
||||||
|
+ }
|
||||||
|
return nil, nil, NewOpenSSLError("EVP_PKEY_CTX_set0_rsa_oaep_label failed")
|
||||||
|
}
|
||||||
|
}
|
@ -1,157 +0,0 @@
|
|||||||
diff --git a/src/net/http/export_test.go b/src/net/http/export_test.go
|
|
||||||
index 657ff9d..67a74ae 100644
|
|
||||||
--- a/src/net/http/export_test.go
|
|
||||||
+++ b/src/net/http/export_test.go
|
|
||||||
@@ -274,6 +274,17 @@ func (s *Server) ExportAllConnsIdle() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
+func (s *Server) ExportAllConnsByState() map[ConnState]int {
|
|
||||||
+ states := map[ConnState]int{}
|
|
||||||
+ s.mu.Lock()
|
|
||||||
+ defer s.mu.Unlock()
|
|
||||||
+ for c := range s.activeConn {
|
|
||||||
+ st, _ := c.getState()
|
|
||||||
+ states[st] += 1
|
|
||||||
+ }
|
|
||||||
+ return states
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
func (r *Request) WithT(t *testing.T) *Request {
|
|
||||||
return r.WithContext(context.WithValue(r.Context(), tLogKey{}, t.Logf))
|
|
||||||
}
|
|
||||||
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
|
|
||||||
index 5f56932..806272b 100644
|
|
||||||
--- a/src/net/http/serve_test.go
|
|
||||||
+++ b/src/net/http/serve_test.go
|
|
||||||
@@ -5519,16 +5519,23 @@ func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-func TestServerShutdown_h1(t *testing.T) { testServerShutdown(t, h1Mode) }
|
|
||||||
-func TestServerShutdown_h2(t *testing.T) { testServerShutdown(t, h2Mode) }
|
|
||||||
+func TestServerShutdown_h1(t *testing.T) {
|
|
||||||
+ testServerShutdown(t, h1Mode)
|
|
||||||
+}
|
|
||||||
+func TestServerShutdown_h2(t *testing.T) {
|
|
||||||
+ testServerShutdown(t, h2Mode)
|
|
||||||
+}
|
|
||||||
|
|
||||||
func testServerShutdown(t *testing.T, h2 bool) {
|
|
||||||
setParallel(t)
|
|
||||||
defer afterTest(t)
|
|
||||||
var doShutdown func() // set later
|
|
||||||
+ var doStateCount func()
|
|
||||||
var shutdownRes = make(chan error, 1)
|
|
||||||
+ var statesRes = make(chan map[ConnState]int, 1)
|
|
||||||
var gotOnShutdown = make(chan struct{}, 1)
|
|
||||||
handler := HandlerFunc(func(w ResponseWriter, r *Request) {
|
|
||||||
+ doStateCount()
|
|
||||||
go doShutdown()
|
|
||||||
// Shutdown is graceful, so it should not interrupt
|
|
||||||
// this in-flight response. Add a tiny sleep here to
|
|
||||||
@@ -5545,6 +5552,9 @@ func testServerShutdown(t *testing.T, h2 bool) {
|
|
||||||
doShutdown = func() {
|
|
||||||
shutdownRes <- cst.ts.Config.Shutdown(context.Background())
|
|
||||||
}
|
|
||||||
+ doStateCount = func() {
|
|
||||||
+ statesRes <- cst.ts.Config.ExportAllConnsByState()
|
|
||||||
+ }
|
|
||||||
get(t, cst.c, cst.ts.URL) // calls t.Fail on failure
|
|
||||||
|
|
||||||
if err := <-shutdownRes; err != nil {
|
|
||||||
@@ -5556,6 +5566,10 @@ func testServerShutdown(t *testing.T, h2 bool) {
|
|
||||||
t.Errorf("onShutdown callback not called, RegisterOnShutdown broken?")
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if states := <-statesRes; states[StateActive] != 1 {
|
|
||||||
+ t.Errorf("connection in wrong state, %v", states)
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
res, err := cst.c.Get(cst.ts.URL)
|
|
||||||
if err == nil {
|
|
||||||
res.Body.Close()
|
|
||||||
diff --git a/src/net/http/server.go b/src/net/http/server.go
|
|
||||||
index d41b5f6..14a6336 100644
|
|
||||||
--- a/src/net/http/server.go
|
|
||||||
+++ b/src/net/http/server.go
|
|
||||||
@@ -324,7 +324,7 @@ func (c *conn) hijackLocked() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
|
|
||||||
return nil, nil, fmt.Errorf("unexpected Peek failure reading buffered byte: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- c.setState(rwc, StateHijacked)
|
|
||||||
+ c.setState(rwc, StateHijacked, runHooks)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1737,7 +1737,12 @@ func validNextProto(proto string) bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
-func (c *conn) setState(nc net.Conn, state ConnState) {
|
|
||||||
+const (
|
|
||||||
+ runHooks = true
|
|
||||||
+ skipHooks = false
|
|
||||||
+)
|
|
||||||
+
|
|
||||||
+func (c *conn) setState(nc net.Conn, state ConnState, runHook bool) {
|
|
||||||
srv := c.server
|
|
||||||
switch state {
|
|
||||||
case StateNew:
|
|
||||||
@@ -1750,6 +1755,9 @@ func (c *conn) setState(nc net.Conn, state ConnState) {
|
|
||||||
}
|
|
||||||
packedState := uint64(time.Now().Unix()<<8) | uint64(state)
|
|
||||||
atomic.StoreUint64(&c.curState.atomic, packedState)
|
|
||||||
+ if !runHook {
|
|
||||||
+ return
|
|
||||||
+ }
|
|
||||||
if hook := srv.ConnState; hook != nil {
|
|
||||||
hook(nc, state)
|
|
||||||
}
|
|
||||||
@@ -1803,7 +1811,7 @@ func (c *conn) serve(ctx context.Context) {
|
|
||||||
}
|
|
||||||
if !c.hijacked() {
|
|
||||||
c.close()
|
|
||||||
- c.setState(c.rwc, StateClosed)
|
|
||||||
+ c.setState(c.rwc, StateClosed, runHooks)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
@@ -1831,6 +1839,10 @@ func (c *conn) serve(ctx context.Context) {
|
|
||||||
if proto := c.tlsState.NegotiatedProtocol; validNextProto(proto) {
|
|
||||||
if fn := c.server.TLSNextProto[proto]; fn != nil {
|
|
||||||
h := initALPNRequest{ctx, tlsConn, serverHandler{c.server}}
|
|
||||||
+ // Mark freshly created HTTP/2 as active and prevent any server state hooks
|
|
||||||
+ // from being run on these connections. This prevents closeIdleConns from
|
|
||||||
+ // closing such connections. See issue https://golang.org/issue/39776.
|
|
||||||
+ c.setState(c.rwc, StateActive, skipHooks)
|
|
||||||
fn(c.server, tlsConn, h)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
@@ -1851,7 +1863,7 @@ func (c *conn) serve(ctx context.Context) {
|
|
||||||
w, err := c.readRequest(ctx)
|
|
||||||
if c.r.remain != c.server.initialReadLimitSize() {
|
|
||||||
// If we read any bytes off the wire, we're active.
|
|
||||||
- c.setState(c.rwc, StateActive)
|
|
||||||
+ c.setState(c.rwc, StateActive, runHooks)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
const errorHeaders = "\r\nContent-Type: text/plain; charset=utf-8\r\nConnection: close\r\n\r\n"
|
|
||||||
@@ -1934,7 +1946,7 @@ func (c *conn) serve(ctx context.Context) {
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
- c.setState(c.rwc, StateIdle)
|
|
||||||
+ c.setState(c.rwc, StateIdle, runHooks)
|
|
||||||
c.curReq.Store((*response)(nil))
|
|
||||||
|
|
||||||
if !w.conn.server.doKeepAlives() {
|
|
||||||
@@ -2965,7 +2977,7 @@ func (srv *Server) Serve(l net.Listener) error {
|
|
||||||
}
|
|
||||||
tempDelay = 0
|
|
||||||
c := srv.newConn(rw)
|
|
||||||
- c.setState(c.rwc, StateNew) // before Serve can return
|
|
||||||
+ c.setState(c.rwc, StateNew, runHooks) // before Serve can return
|
|
||||||
go c.serve(connCtx)
|
|
||||||
}
|
|
||||||
}
|
|
109
SOURCES/reject-leading-zeros.patch
Normal file
109
SOURCES/reject-leading-zeros.patch
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
diff --git a/doc/go1.16.html b/doc/go1.16.html
|
||||||
|
index 0beb62d..fc6b668 100644
|
||||||
|
--- a/doc/go1.16.html
|
||||||
|
+++ b/doc/go1.16.html
|
||||||
|
@@ -891,6 +891,14 @@ func TestFoo(t *testing.T) {
|
||||||
|
is missing; this is common on musl-based systems and makes
|
||||||
|
Go programs match the behavior of C programs on those systems.
|
||||||
|
</p>
|
||||||
|
+ <p><!-- CL325829 -->
|
||||||
|
+ The <a href="/pkg/net/#ParseIP"><code>ParseIP</code></a> and <a href="/pkg/net/#ParseCIDR"><code>ParseCIDR</code></a>
|
||||||
|
+ functions now reject IPv4 addresses which contain decimal components with leading zeros.
|
||||||
|
+ These components were always interpreted as decimal, but some operating systems treat them as octal.
|
||||||
|
+ This mismatch could hypothetically lead to security issues if a Go application was used to validate IP addresses
|
||||||
|
+ which were then used in their original form with non-Go applications which interpreted components as octal. Generally,
|
||||||
|
+ it is advisable to always re-encoded values after validation, which avoids this class of parser misalignment issues.
|
||||||
|
+ </p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net -->
|
||||||
|
|
||||||
|
diff --git a/src/net/hosts_test.go b/src/net/hosts_test.go
|
||||||
|
index f850e2f..19c4399 100644
|
||||||
|
--- a/src/net/hosts_test.go
|
||||||
|
+++ b/src/net/hosts_test.go
|
||||||
|
@@ -36,7 +36,7 @@ var lookupStaticHostTests = []struct {
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
- "testdata/ipv4-hosts", // see golang.org/issue/8996
|
||||||
|
+ "testdata/ipv4-hosts",
|
||||||
|
[]staticHostEntry{
|
||||||
|
{"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}},
|
||||||
|
{"localhost.localdomain", []string{"127.0.0.3"}},
|
||||||
|
@@ -102,7 +102,7 @@ var lookupStaticAddrTests = []struct {
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
- "testdata/ipv4-hosts", // see golang.org/issue/8996
|
||||||
|
+ "testdata/ipv4-hosts",
|
||||||
|
[]staticHostEntry{
|
||||||
|
{"127.0.0.1", []string{"localhost"}},
|
||||||
|
{"127.0.0.2", []string{"localhost"}},
|
||||||
|
diff --git a/src/net/ip.go b/src/net/ip.go
|
||||||
|
index c00fe8e..007f3f7 100644
|
||||||
|
--- a/src/net/ip.go
|
||||||
|
+++ b/src/net/ip.go
|
||||||
|
@@ -552,6 +552,10 @@ func parseIPv4(s string) IP {
|
||||||
|
if !ok || n > 0xFF {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
+ if c > 1 && s[0] == '0' {
|
||||||
|
+ // Reject non-zero components with leading zeroes.
|
||||||
|
+ return nil
|
||||||
|
+ }
|
||||||
|
s = s[c:]
|
||||||
|
p[i] = byte(n)
|
||||||
|
}
|
||||||
|
diff --git a/src/net/ip_test.go b/src/net/ip_test.go
|
||||||
|
index a5fc5e6..585381d 100644
|
||||||
|
--- a/src/net/ip_test.go
|
||||||
|
+++ b/src/net/ip_test.go
|
||||||
|
@@ -20,9 +20,7 @@ var parseIPTests = []struct {
|
||||||
|
}{
|
||||||
|
{"127.0.1.2", IPv4(127, 0, 1, 2)},
|
||||||
|
{"127.0.0.1", IPv4(127, 0, 0, 1)},
|
||||||
|
- {"127.001.002.003", IPv4(127, 1, 2, 3)},
|
||||||
|
{"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
|
- {"::ffff:127.001.002.003", IPv4(127, 1, 2, 3)},
|
||||||
|
{"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
|
||||||
|
{"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
|
{"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
|
@@ -42,6 +40,11 @@ var parseIPTests = []struct {
|
||||||
|
{"fe80::1%911", nil},
|
||||||
|
{"", nil},
|
||||||
|
{"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628
|
||||||
|
+ {"127.001.002.003", nil},
|
||||||
|
+ {"::ffff:127.001.002.003", nil},
|
||||||
|
+ {"123.000.000.000", nil},
|
||||||
|
+ {"1.2..4", nil},
|
||||||
|
+ {"0123.0.0.1", nil},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseIP(t *testing.T) {
|
||||||
|
@@ -357,6 +360,7 @@ var parseCIDRTests = []struct {
|
||||||
|
{"0.0.-2.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.-2.0/32"}},
|
||||||
|
{"0.0.0.-3/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.-3/32"}},
|
||||||
|
{"0.0.0.0/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.0/-0"}},
|
||||||
|
+ {"127.000.000.001/32", nil, nil, &ParseError{Type: "CIDR address", Text: "127.000.000.001/32"}},
|
||||||
|
{"", nil, nil, &ParseError{Type: "CIDR address", Text: ""}},
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/net/testdata/ipv4-hosts b/src/net/testdata/ipv4-hosts
|
||||||
|
index 5208bb4..6b99675 100644
|
||||||
|
--- a/src/net/testdata/ipv4-hosts
|
||||||
|
+++ b/src/net/testdata/ipv4-hosts
|
||||||
|
@@ -1,12 +1,8 @@
|
||||||
|
# See https://tools.ietf.org/html/rfc1123.
|
||||||
|
-#
|
||||||
|
-# The literal IPv4 address parser in the net package is a relaxed
|
||||||
|
-# one. It may accept a literal IPv4 address in dotted-decimal notation
|
||||||
|
-# with leading zeros such as "001.2.003.4".
|
||||||
|
|
||||||
|
# internet address and host name
|
||||||
|
127.0.0.1 localhost # inline comment separated by tab
|
||||||
|
-127.000.000.002 localhost # inline comment separated by space
|
||||||
|
+127.0.0.2 localhost # inline comment separated by space
|
||||||
|
|
||||||
|
# internet address, host name and aliases
|
||||||
|
-127.000.000.003 localhost localhost.localdomain
|
||||||
|
+127.0.0.3 localhost localhost.localdomain
|
12
SOURCES/skip_test_rhbz1939923.patch
Normal file
12
SOURCES/skip_test_rhbz1939923.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go
|
||||||
|
index 51dda16815..2d1e1b1e6e 100644
|
||||||
|
--- a/src/crypto/x509/x509_test.go
|
||||||
|
+++ b/src/crypto/x509/x509_test.go
|
||||||
|
@@ -2880,6 +2880,7 @@ func (bs *brokenSigner) Sign(_ io.Reader, _ []byte, _ crypto.SignerOpts) ([]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateCertificateBrokenSigner(t *testing.T) {
|
||||||
|
+ t.Skip("TODO Fix me: rhbz#1939923")
|
||||||
|
template := &Certificate{
|
||||||
|
SerialNumber: big.NewInt(10),
|
||||||
|
DNSNames: []string{"example.com"},
|
@ -1,24 +0,0 @@
|
|||||||
diff --git a/src/vendor/golang.org/x/text/transform/transform.go b/src/vendor/golang.org/x/text/transform/transform.go
|
|
||||||
index 520b9ad..48ec64b 100644
|
|
||||||
--- a/src/vendor/golang.org/x/text/transform/transform.go
|
|
||||||
+++ b/src/vendor/golang.org/x/text/transform/transform.go
|
|
||||||
@@ -648,7 +648,8 @@ func String(t Transformer, s string) (result string, n int, err error) {
|
|
||||||
// Transform the remaining input, growing dst and src buffers as necessary.
|
|
||||||
for {
|
|
||||||
n := copy(src, s[pSrc:])
|
|
||||||
- nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s))
|
|
||||||
+ atEOF := pSrc+n == len(s)
|
|
||||||
+ nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], atEOF)
|
|
||||||
pDst += nDst
|
|
||||||
pSrc += nSrc
|
|
||||||
|
|
||||||
@@ -659,6 +660,9 @@ func String(t Transformer, s string) (result string, n int, err error) {
|
|
||||||
dst = grow(dst, pDst)
|
|
||||||
}
|
|
||||||
} else if err == ErrShortSrc {
|
|
||||||
+ if atEOF {
|
|
||||||
+ return string(dst[:pDst]), pSrc, err
|
|
||||||
+ }
|
|
||||||
if nSrc == 0 {
|
|
||||||
src = grow(src, 0)
|
|
||||||
}
|
|
@ -95,8 +95,8 @@
|
|||||||
%global gohostarch s390x
|
%global gohostarch s390x
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%global go_api 1.15
|
%global go_api 1.16
|
||||||
%global go_version 1.15.7
|
%global go_version 1.16.7
|
||||||
%global pkg_release 1
|
%global pkg_release 1
|
||||||
|
|
||||||
Name: golang
|
Name: golang
|
||||||
@ -135,32 +135,25 @@ Requires: diffutils
|
|||||||
|
|
||||||
# we had been just removing the zoneinfo.zip, but that caused tests to fail for users that
|
# we had been just removing the zoneinfo.zip, but that caused tests to fail for users that
|
||||||
# later run `go test -a std`. This makes it only use the zoneinfo.zip where needed in tests.
|
# later run `go test -a std`. This makes it only use the zoneinfo.zip where needed in tests.
|
||||||
Patch215: ./go1.5-zoneinfo_testing_only.patch
|
Patch215: go1.5-zoneinfo_testing_only.patch
|
||||||
|
|
||||||
# Proposed patch by jcajka https://golang.org/cl/86541
|
# Proposed patch by jcajka https://golang.org/cl/86541
|
||||||
Patch221: fix_TestScript_list_std.patch
|
Patch221: fix_TestScript_list_std.patch
|
||||||
|
|
||||||
# It seems this patch will be included in Go 1.14.5
|
|
||||||
# https://github.com/golang/go/issues/39991
|
|
||||||
# https://go-review.googlesource.com/c/go/+/240917
|
|
||||||
#Patch240917: ppc64le_fix_missing_deferreturn.patch
|
|
||||||
|
|
||||||
# Add an env var to optionally trigger a warning in x509 when
|
# Add an env var to optionally trigger a warning in x509 when
|
||||||
# Common Name is used as hostname
|
# Common Name is used as hostname
|
||||||
# rhbz#1889437
|
# rhbz#1889437
|
||||||
Patch223: golang-1.15-warnCN.patch
|
Patch223: golang-1.15-warnCN.patch
|
||||||
|
|
||||||
# Gracefully shut down http2 connections
|
# Fix incorrect parsing of extraneous zeros in net/ip
|
||||||
# https://go-review.googlesource.com/c/go/+/240278
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1993316
|
||||||
# rhbz#1888673
|
# https://go-review.googlesource.com/c/go/+/325829
|
||||||
Patch224: net-http-graceful-shutdown.patch
|
Patch1993316: reject-leading-zeros.patch
|
||||||
|
|
||||||
# Prevent transform from entering infinite loop.
|
Patch1939923: skip_test_rhbz1939923.patch
|
||||||
# We're just picking the change from transform.go
|
|
||||||
# because the encoding module is not included
|
# Fix FIPS mode memory leaks
|
||||||
# as a vendor dependency.
|
Patch1951877: fix-crypto-memory-leaks.patch
|
||||||
# https://go-review.googlesource.com/c/text/+/238238
|
|
||||||
Patch225: x-text-infinite-loop.patch
|
|
||||||
|
|
||||||
# Having documentation separate was broken
|
# Having documentation separate was broken
|
||||||
Obsoletes: %{name}-docs < 1.1-4
|
Obsoletes: %{name}-docs < 1.1-4
|
||||||
@ -255,13 +248,14 @@ Requires: %{name} = %{version}-%{release}
|
|||||||
|
|
||||||
%patch221 -p1
|
%patch221 -p1
|
||||||
|
|
||||||
#%patch240917 -p1
|
|
||||||
|
|
||||||
%patch223 -p1
|
%patch223 -p1
|
||||||
|
|
||||||
%patch224 -p1
|
%patch1939923 -p1
|
||||||
|
|
||||||
|
%patch1993316 -p1
|
||||||
|
|
||||||
|
%patch1951877 -p1
|
||||||
|
|
||||||
%patch225 -p1
|
|
||||||
|
|
||||||
cp %{SOURCE1} ./src/runtime/
|
cp %{SOURCE1} ./src/runtime/
|
||||||
|
|
||||||
@ -529,6 +523,53 @@ cd ..
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Aug 17 2021 David Benoit <dbenoit@redhat.com> - 1.16.7-1
|
||||||
|
- Rebase to Go 1.16.7
|
||||||
|
- Resolves: rhbz#1994079
|
||||||
|
- Add reject leading zeros patch
|
||||||
|
- Resolves: rhbz#1993314
|
||||||
|
|
||||||
|
* Wed Jul 21 2021 Derek Parker <deparker@redhat.com> - 1.16.6-2
|
||||||
|
- Fix TestBoringServerCurves failure when run by itself
|
||||||
|
- Resolves: rhbz#1976168
|
||||||
|
|
||||||
|
* Thu Jul 15 2021 David Benoit <dbenoit@redhat.com> - 1.16.6-1
|
||||||
|
- Rebase to go-1.16.6-1-openssl-fips
|
||||||
|
- Resolves: rhbz#1982281
|
||||||
|
- Addresses CVE-2021-34558
|
||||||
|
|
||||||
|
* Tue Jul 06 2021 Alejandro Sáez <asm@redhat.com> - 1.16.5-1
|
||||||
|
- Rebase to 1.16.5
|
||||||
|
- Removes rhbz#1955032 patch, it's already included in this release
|
||||||
|
- Removes rhbz#1956891 patch, it's already included in this release
|
||||||
|
- Related: rhbz#1979677
|
||||||
|
- Related: rhbz#1968738
|
||||||
|
- Related: rhbz#1972420
|
||||||
|
|
||||||
|
* Thu Jun 17 2021 David Benoit <dbenoit@redhat.com> - 1.16.4-3
|
||||||
|
- Fix zero-size allocation memory leak.
|
||||||
|
- Related: rhbz#1951877
|
||||||
|
|
||||||
|
* Tue Jun 08 2021 David Benoit <dbenoit@redhat.com> - 1.16.4-2
|
||||||
|
- Resolves: rhbz#1951877
|
||||||
|
|
||||||
|
* Mon May 24 2021 Alejandro Sáez <asm@redhat.com> - 1.16.4-1
|
||||||
|
- Rebase to go-1.16.4-1-openssl-fips
|
||||||
|
|
||||||
|
* Tue May 04 2021 Alejandro Sáez <asm@redhat.com> - 1.16.1-3
|
||||||
|
- Resolves: rhbz#1956891
|
||||||
|
|
||||||
|
* Thu Apr 29 2021 Alejandro Sáez <asm@redhat.com> - 1.16.1-2
|
||||||
|
- Resolves: rhbz#1955032
|
||||||
|
|
||||||
|
* Wed Mar 17 2021 Alejandro Sáez <asm@redhat.com> - 1.16.1-1
|
||||||
|
- Rebase to go-1.16.1-2-openssl-fips
|
||||||
|
- Resolves: rhbz#1938071
|
||||||
|
- Adds a workaround for rhbz#1939923
|
||||||
|
- Removes Patch224, it's on upstream -> rhbz#1888673
|
||||||
|
- Removes Patch225, it's on upstream -> https://go-review.googlesource.com/c/text/+/238238
|
||||||
|
- Removes old patches for cleaning purposes
|
||||||
|
|
||||||
* Fri Jan 22 2021 David Benoit <dbenoit@redhat.com> - 1.15.7-1
|
* Fri Jan 22 2021 David Benoit <dbenoit@redhat.com> - 1.15.7-1
|
||||||
- Rebase to 1.15.7
|
- Rebase to 1.15.7
|
||||||
- Resolves: rhbz#1870531
|
- Resolves: rhbz#1870531
|
||||||
|
Loading…
Reference in New Issue
Block a user