summaryrefslogtreecommitdiff
path: root/dev-lang/go
diff options
context:
space:
mode:
Diffstat (limited to 'dev-lang/go')
-rw-r--r--dev-lang/go/Manifest1
-rw-r--r--dev-lang/go/files/go-1.24.9-ipv6-validation.patch86
-rw-r--r--dev-lang/go/go-1.24.9.ebuild130
3 files changed, 217 insertions, 0 deletions
diff --git a/dev-lang/go/Manifest b/dev-lang/go/Manifest
index a1ee0e150ee5..d5cd040803c9 100644
--- a/dev-lang/go/Manifest
+++ b/dev-lang/go/Manifest
@@ -1,2 +1,3 @@
DIST go1.24.7.src.tar.gz 30794506 BLAKE2B 850ffc97c83843c83d4dfb672dbe18c16b6feda5b76b70213241d583b5ef6c2c8d0bf532e15fa58cb4fceaaf1f66b52166d3badfc294ebecd1076ddd9c7a572e SHA512 656bb879244ba888af18b6e609fb2c4bc067b919827b9026c3ee44b3e2d0c7bffde262945de989880066196846b669c215da2e8c5d9adfb8491bb5d52af0d49a
+DIST go1.24.9.src.tar.gz 30800154 BLAKE2B 30e5ea7dac441a94bd023e152075651583b697c555da73e1581b6eef3dfdee0f7c30a774b8e9704940af60c43e97c8e8ba89b9e84d672a4805b5c969a4140ee8 SHA512 f553a6bdafa9e59d33756c99f6180dcb7e51762733f300488cdab1d42b918e0fff87fa42d714a6b667e039dd22e1ea14ef5f6e3eb1c9c215ff620d559a5c091a
DIST go1.25.1.src.tar.gz 31974863 BLAKE2B a9f0d27a292b8197ed2307bcfe90af0adccaa1e0e8de0d59df5b65f57ac7dd2cbaee1905401f81af994934fa83070e42c24ff6090affe56461198e89457842c7 SHA512 e77ae799a0dcd4ded40a196c3645da5b7e808e417831d2c5441387b0fd0ed5f946b678305294c52fda0a258889225c24c6073bb0973c3531ba4aa107b6afe849
diff --git a/dev-lang/go/files/go-1.24.9-ipv6-validation.patch b/dev-lang/go/files/go-1.24.9-ipv6-validation.patch
new file mode 100644
index 000000000000..f9db3f7ee898
--- /dev/null
+++ b/dev-lang/go/files/go-1.24.9-ipv6-validation.patch
@@ -0,0 +1,86 @@
+From e02a9d02d0181394e243cbc3b356e86896a78e2c Mon Sep 17 00:00:00 2001
+From: Roland Shoemaker <roland@golang.org>
+Date: Wed, 08 Oct 2025 17:13:12 -0700
+Subject: [PATCH] [release-branch.go1.24] net/url: allow IP-literals with IPv4-mapped IPv6 addresses
+
+The security fix we applied in CL709857 was overly broad. It applied
+rules from RFC 2732, which disallowed IPv4-mapped IPv6 addresses, but
+these were later allowed in RFC 3986, which is the canonical URI syntax
+RFC.
+
+Revert the portion of CL709857 which restricted IPv4-mapped addresses,
+and update the related tests.
+
+Updates #75815
+Fixes #75831
+
+Change-Id: I3192f2275ad5c386f5c15006a6716bdb5282919d
+Reviewed-on: https://go-review.googlesource.com/c/go/+/710375
+LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
+Reviewed-by: Ethan Lee <ethanalee@google.com>
+Auto-Submit: Roland Shoemaker <roland@golang.org>
+(cherry picked from commit 9db7e30bb42eed9912f5e7e9e3959f3b38879d5b)
+---
+
+diff --git a/src/net/url/url.go b/src/net/url/url.go
+index c686239..1d9c1cd 100644
+--- a/src/net/url/url.go
++++ b/src/net/url/url.go
+@@ -670,13 +670,13 @@
+
+ // Per RFC 3986, only a host identified by a valid
+ // IPv6 address can be enclosed by square brackets.
+- // This excludes any IPv4 or IPv4-mapped addresses.
++ // This excludes any IPv4, but notably not IPv4-mapped addresses.
+ addr, err := netip.ParseAddr(unescapedHostname)
+ if err != nil {
+ return "", fmt.Errorf("invalid host: %w", err)
+ }
+- if addr.Is4() || addr.Is4In6() {
+- return "", errors.New("invalid IPv6 host")
++ if addr.Is4() {
++ return "", errors.New("invalid IP-literal")
+ }
+ return "[" + unescapedHostname + "]" + unescapedColonPort, nil
+ } else if i := strings.LastIndex(host, ":"); i != -1 {
+diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go
+index 3206558..6084fac 100644
+--- a/src/net/url/url_test.go
++++ b/src/net/url/url_test.go
+@@ -726,7 +726,7 @@
+ {"https://[2001:db8::1]/path", true}, // compressed IPv6 address with path
+ {"https://[fe80::1%25eth0]/path?query=1", true}, // link-local with zone, path, and query
+
+- {"https://[::ffff:192.0.2.1]", false},
++ {"https://[::ffff:192.0.2.1]", true},
+ {"https://[:1] ", false},
+ {"https://[1:2:3:4:5:6:7:8:9]", false},
+ {"https://[1::1::1]", false},
+@@ -1672,16 +1672,17 @@
+ {"cache_object:foo/bar", true},
+ {"cache_object/:foo/bar", false},
+
+- {"http://[192.168.0.1]/", true}, // IPv4 in brackets
+- {"http://[192.168.0.1]:8080/", true}, // IPv4 in brackets with port
+- {"http://[::ffff:192.168.0.1]/", true}, // IPv4-mapped IPv6 in brackets
+- {"http://[::ffff:192.168.0.1]:8080/", true}, // IPv4-mapped IPv6 in brackets with port
+- {"http://[::ffff:c0a8:1]/", true}, // IPv4-mapped IPv6 in brackets (hex)
+- {"http://[not-an-ip]/", true}, // invalid IP string in brackets
+- {"http://[fe80::1%foo]/", true}, // invalid zone format in brackets
+- {"http://[fe80::1", true}, // missing closing bracket
+- {"http://fe80::1]/", true}, // missing opening bracket
+- {"http://[test.com]/", true}, // domain name in brackets
++ {"http://[192.168.0.1]/", true}, // IPv4 in brackets
++ {"http://[192.168.0.1]:8080/", true}, // IPv4 in brackets with port
++ {"http://[::ffff:192.168.0.1]/", false}, // IPv4-mapped IPv6 in brackets
++ {"http://[::ffff:192.168.0.1000]/", true}, // Out of range IPv4-mapped IPv6 in brackets
++ {"http://[::ffff:192.168.0.1]:8080/", false}, // IPv4-mapped IPv6 in brackets with port
++ {"http://[::ffff:c0a8:1]/", false}, // IPv4-mapped IPv6 in brackets (hex)
++ {"http://[not-an-ip]/", true}, // invalid IP string in brackets
++ {"http://[fe80::1%foo]/", true}, // invalid zone format in brackets
++ {"http://[fe80::1", true}, // missing closing bracket
++ {"http://fe80::1]/", true}, // missing opening bracket
++ {"http://[test.com]/", true}, // domain name in brackets
+ }
+ for _, tt := range tests {
+ u, err := Parse(tt.in)
diff --git a/dev-lang/go/go-1.24.9.ebuild b/dev-lang/go/go-1.24.9.ebuild
new file mode 100644
index 000000000000..caba97d70e7e
--- /dev/null
+++ b/dev-lang/go/go-1.24.9.ebuild
@@ -0,0 +1,130 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+export CBUILD=${CBUILD:-${CHOST}}
+export CTARGET=${CTARGET:-${CHOST}}
+
+# See "Bootstrap" in release notes
+GO_BOOTSTRAP_MIN=1.22.12
+MY_PV=${PV/_/}
+
+inherit go-env toolchain-funcs
+
+case ${PV} in
+*9999*)
+ EGIT_REPO_URI="https://github.com/golang/go.git"
+ inherit git-r3
+ ;;
+*)
+ SRC_URI="https://storage.googleapis.com/golang/go${MY_PV}.src.tar.gz "
+ S="${WORKDIR}"/go
+ KEYWORDS="-* ~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris"
+ ;;
+esac
+
+DESCRIPTION="A concurrent garbage collected and typesafe programming language"
+HOMEPAGE="https://go.dev"
+
+LICENSE="BSD"
+SLOT="0/${PV}"
+IUSE="cpu_flags_x86_sse2"
+
+BDEPEND="|| (
+ >=dev-lang/go-${GO_BOOTSTRAP_MIN}
+ >=dev-lang/go-bootstrap-${GO_BOOTSTRAP_MIN} )"
+
+# the *.syso files have writable/executable stacks
+QA_EXECSTACK='*.syso'
+
+# Do not complain about CFLAGS, etc, since Go doesn't use them.
+QA_FLAGS_IGNORED='.*'
+
+# The tools in /usr/lib/go should not cause the multilib-strict check to fail.
+QA_MULTILIB_PATHS="usr/lib/go/pkg/tool/.*/.*"
+
+# This package triggers "unrecognized elf file(s)" notices on riscv.
+# https://bugs.gentoo.org/794046
+QA_PREBUILT="*"
+QA_PRESTRIPPED="*.syso"
+
+DOCS=(
+ CONTRIBUTING.md
+ PATENTS
+ README.md
+ SECURITY.md
+)
+
+go_tuple() {
+ echo "$(go-env_goos $@)_$(go-env_goarch $@)"
+}
+
+go_cross_compile() {
+ [[ $(go_tuple ${CBUILD}) != $(go_tuple) ]]
+}
+
+PATCHES=(
+ "${FILESDIR}"/go-1.24-skip-gdb-tests.patch
+ "${FILESDIR}"/go-1.24-dont-force-gold-arm.patch
+ "${FILESDIR}"/go-1.24.9-ipv6-validation.patch # https://go-review.googlesource.com/c/go/+/712142
+ "${FILESDIR}"/go-never-download-newer-toolchains.patch
+)
+
+src_compile() {
+ if has_version -b ">=dev-lang/go-${GO_BOOTSTRAP_MIN}"; then
+ export GOROOT_BOOTSTRAP="${BROOT}/usr/lib/go"
+ elif has_version -b ">=dev-lang/go-bootstrap-${GO_BOOTSTRAP_MIN}"; then
+ export GOROOT_BOOTSTRAP="${BROOT}/usr/lib/go-bootstrap"
+ else
+ eerror "Go cannot be built without go or go-bootstrap installed"
+ die "Should not be here, please report a bug"
+ fi
+
+ # Go's build script does not use BUILD/HOST/TARGET consistently. :(
+ export GOHOSTARCH=$(go-env_goarch ${CBUILD})
+ export GOHOSTOS=$(go-env_goos ${CBUILD})
+ export CC=$(tc-getBUILD_CC)
+
+ export GOARCH=$(go-env_goarch)
+ export GOOS=$(go-env_goos)
+ export CC_FOR_TARGET=$(tc-getCC)
+ export CXX_FOR_TARGET=$(tc-getCXX)
+ use arm && export GOARM=$(go-env_goarm)
+ use x86 && export GO386=$(go-env_go386)
+
+ cd src
+ bash -x ./make.bash || die "build failed"
+}
+
+src_test() {
+ go_cross_compile && return 0
+ cd src
+ PATH="${GOBIN}:${PATH}" \
+ ./run.bash -no-rebuild -k || die "tests failed"
+}
+
+src_install() {
+ dodir /usr/lib/go
+ # The use of cp is deliberate in order to retain permissions
+ cp -R . "${ED}"/usr/lib/go
+ einstalldocs
+
+ # testdata directories are not needed on the installed system
+ # The other files we remove are installed by einstalldocs
+ rm -r $(find "${ED}"/usr/lib/go -iname testdata -type d -print) || die
+ rm "${ED}"/usr/lib/go/{CONTRIBUTING.md,PATENTS,README.md} || die
+ rm "${ED}"/usr/lib/go/{SECURITY.md,codereview.cfg,LICENSE} || die
+
+ local bin_path
+ if go_cross_compile; then
+ bin_path="bin/$(go_tuple)"
+ else
+ bin_path=bin
+ fi
+ local f x
+ for x in ${bin_path}/*; do
+ f=${x##*/}
+ dosym ../lib/go/${bin_path}/${f} /usr/bin/${f}
+ done
+}