diff --git a/download b/download
new file mode 100644
index 0000000000000000000000000000000000000000..756c91f648f2384b1a261633617f542f09ffc4a6
--- /dev/null
+++ b/download
@@ -0,0 +1 @@
+17410e2ec2dbfe34d042ca0bbec189da go-go-1.17.7-1-openssl-fips.tar.gz
diff --git a/fix-crypto-memory-leaks.patch b/fix-crypto-memory-leaks.patch
deleted file mode 100644
index daab969a36f6721817654dc1bb3481b568c6bb9c..0000000000000000000000000000000000000000
--- a/fix-crypto-memory-leaks.patch
+++ /dev/null
@@ -1,235 +0,0 @@
-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")
- }
- }
diff --git a/go-go-1.16.12-1-openssl-fips.tar.gz b/go-go-1.16.12-1-openssl-fips.tar.gz
deleted file mode 100644
index bf1f9099eb2d3a419fe17e10da539940c5b0fc4b..0000000000000000000000000000000000000000
Binary files a/go-go-1.16.12-1-openssl-fips.tar.gz and /dev/null differ
diff --git a/golang-1.15-warnCN.patch b/golang-1.15-warnCN.patch
deleted file mode 100644
index 5d9cf82699c94803f472f659f789766a6bfe9e7e..0000000000000000000000000000000000000000
--- a/golang-1.15-warnCN.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff --git a/src/crypto/x509/verify.go b/src/crypto/x509/verify.go
-index 50f4d4a..121fd1b 100644
---- a/src/crypto/x509/verify.go
-+++ b/src/crypto/x509/verify.go
-@@ -20,6 +20,9 @@ import (
-
- // ignoreCN disables interpreting Common Name as a hostname. See issue 24151.
- var ignoreCN = !strings.Contains(os.Getenv("GODEBUG"), "x509ignoreCN=0")
-+// if using Common Name as a hostname is enabled via x509ignoreCN=0,
-+// warnCN enables a warning whenever Common Name is interpreted as a hostname.
-+var warnCN = strings.Contains(os.Getenv("GODEBUG"), "x509warnCN=1")
-
- type InvalidReason int
-
-@@ -1078,6 +1081,10 @@ func (c *Certificate) VerifyHostname(h string) error {
- names := c.DNSNames
- if c.commonNameAsHostname() {
- names = []string{c.Subject.CommonName}
-+ if warnCN {
-+ fmt.Fprintf(os.Stderr, "x509: Warning - certificate relies on legacy Common Name field. " +
-+ "Using CN without SAN is deprecated and will not work in future versions.\n")
-+ }
- }
-
- candidateName := toLowerCaseASCII(h) // Save allocations inside the loop.
diff --git a/golang.spec b/golang.spec
index 8d271f7d10e65ee513c9f20966d9e5f5ac8f4b13..06c5d7b05b1193dbece75c27179b56927f9f0d70 100644
--- a/golang.spec
+++ b/golang.spec
@@ -95,8 +95,8 @@
%global gohostarch s390x
%endif
-%global go_api 1.16
-%global go_version 1.16.12
+%global go_api 1.17
+%global go_version 1.17.7
%global pkg_release 1
Name: golang
@@ -140,20 +140,12 @@ Patch215: go1.5-zoneinfo_testing_only.patch
# Proposed patch by jcajka https://golang.org/cl/86541
Patch221: fix_TestScript_list_std.patch
-# Add an env var to optionally trigger a warning in x509 when
-# Common Name is used as hostname
-# rhbz#1889437
-Patch223: golang-1.15-warnCN.patch
-
-# Fix incorrect parsing of extraneous zeros in net/ip
-# https://bugzilla.redhat.com/show_bug.cgi?id=1993316
-# https://go-review.googlesource.com/c/go/+/325829
-Patch1993316: reject-leading-zeros.patch
-
Patch1939923: skip_test_rhbz1939923.patch
-# Fix FIPS mode memory leaks
-Patch1951877: fix-crypto-memory-leaks.patch
+# These tests has been removed upstream due to
+# nondeterministic flakiness
+# https://bugzilla.redhat.com/show_bug.cgi?id=2028662
+Patch2028662: remove_waitgroup_misuse_tests.patch
# Having documentation separate was broken
Obsoletes: %{name}-docs < 1.1-4
@@ -248,14 +240,9 @@ Requires: %{name} = %{version}-%{release}
%patch221 -p1
-%patch223 -p1
-
%patch1939923 -p1
-%patch1993316 -p1
-
-%patch1951877 -p1
-
+%patch2028662 -p1
cp %{SOURCE1} ./src/runtime/
@@ -326,7 +313,7 @@ rm -rf pkg/bootstrap/bin
# install everything into libdir (until symlink problems are fixed)
# https://code.google.com/p/go/issues/detail?id=5830
-cp -apv api bin doc favicon.ico lib pkg robots.txt src misc test VERSION \
+cp -apv api bin doc lib pkg src misc test VERSION \
$RPM_BUILD_ROOT%{goroot}
# bz1099206
@@ -414,6 +401,9 @@ cp -av %{SOURCE100} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit.d/golang.gdb
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d
cp -av %{SOURCE101} $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d/golang.conf
+# Quick fix for the rhbz#2014704
+sed -i 's/const defaultGO_LDSO = `.*`/const defaultGO_LDSO = ``/' $RPM_BUILD_ROOT%{goroot}/src/internal/buildcfg/zbootstrap.go
+
%check
export GOROOT=$(pwd -P)
export PATH="$GOROOT"/bin:"$PATH"
@@ -448,19 +438,23 @@ export GO_TEST_RUN=""
%if %{fail_on_tests}
-./run.bash --no-rebuild -v -v -v -k $GO_TEST_RUN
+# TestEd25519Vectors needs network connectivity but it should be cover by
+# this test https://pkgs.devel.redhat.com/cgit/tests/golang/tree/Regression/internal-testsuite/runtest.sh#n127
+export DISABLE_Ed25519_TEST="-run=!^TestEd25519Vectors$"
+
+./run.bash --no-rebuild -v -v -v -k $GO_TEST_RUN $DISABLE_Ed25519_TEST
# Run tests with FIPS enabled.
export GOLANG_FIPS=1
pushd crypto
# Run all crypto tests but skip TLS, we will run FIPS specific TLS tests later
- go test $(go list ./... | grep -v tls) -v
+ go test $(go list ./... | grep -v tls) -v $DISABLE_Ed25519_TEST
# Check that signature functions have parity between boring and notboring
- CGO_ENABLED=0 go test $(go list ./... | grep -v tls) -v
+ CGO_ENABLED=0 go test $(go list ./... | grep -v tls) -v $DISABLE_Ed25519_TEST
popd
# Run all FIPS specific TLS tests
pushd crypto/tls
- go test -v -run "Boring"
+ go test -v -run "Boring" $DISABLE_Ed25519_TEST
popd
%else
./run.bash --no-rebuild -v -v -v -k || :
@@ -523,9 +517,36 @@ cd ..
%endif
%changelog
-* Fri Dec 10 2021 David Benoit
-+ The ParseIP
and ParseCIDR
-+ 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.
-+