summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepak Rathore <deeratho@cisco.com>2026-02-11 20:59:43 -0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2026-02-27 17:45:06 +0000
commite333b43a692acd58d42c5bdb8ac54b41c07e8a0d (patch)
tree89d33c29da189e25271c7cb62216a025229c9173
parent242963f4cd1597d31a3efae2422016bf888c6e25 (diff)
downloadpoky-e333b43a692acd58d42c5bdb8ac54b41c07e8a0d.tar.gz
go 1.22.12: Fix CVE-2025-61728
Upstream Repository: https://github.com/golang/go.git Bug details: https://nvd.nist.gov/vuln/detail/CVE-2025-61728 Type: Security Fix CVE: CVE-2025-61728 Score: 6.5 Patch: https://github.com/golang/go/commit/3235ef3db85c (From OE-Core rev: 31eb409b8a0537d97e09e6a13b8182db4135f3c9) Signed-off-by: Deepak Rathore <deeratho@cisco.com> Signed-off-by: Yoann Congal <yoann.congal@smile.fr> Signed-off-by: Paul Barker <paul@pbarker.dev> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/go/go-1.22.12.inc1
-rw-r--r--meta/recipes-devtools/go/go/CVE-2025-61728.patch171
2 files changed, 172 insertions, 0 deletions
diff --git a/meta/recipes-devtools/go/go-1.22.12.inc b/meta/recipes-devtools/go/go-1.22.12.inc
index 46f6ef5d8f..04e380c821 100644
--- a/meta/recipes-devtools/go/go-1.22.12.inc
+++ b/meta/recipes-devtools/go/go-1.22.12.inc
@@ -33,6 +33,7 @@ SRC_URI += "\
33 file://CVE-2025-61729.patch \ 33 file://CVE-2025-61729.patch \
34 file://CVE-2025-61730.patch \ 34 file://CVE-2025-61730.patch \
35 file://CVE-2025-61726.patch \ 35 file://CVE-2025-61726.patch \
36 file://CVE-2025-61728.patch \
36" 37"
37SRC_URI[main.sha256sum] = "012a7e1f37f362c0918c1dfa3334458ac2da1628c4b9cf4d9ca02db986e17d71" 38SRC_URI[main.sha256sum] = "012a7e1f37f362c0918c1dfa3334458ac2da1628c4b9cf4d9ca02db986e17d71"
38 39
diff --git a/meta/recipes-devtools/go/go/CVE-2025-61728.patch b/meta/recipes-devtools/go/go/CVE-2025-61728.patch
new file mode 100644
index 0000000000..99266ed7a8
--- /dev/null
+++ b/meta/recipes-devtools/go/go/CVE-2025-61728.patch
@@ -0,0 +1,171 @@
1From 727c39f7e6c9dc9d4a40d67f39f68ae8867a2abd Mon Sep 17 00:00:00 2001
2From: Damien Neil <dneil@google.com>
3Date: Tue, 4 Nov 2025 17:00:33 -0800
4Subject: [PATCH] [release-branch.go1.24] archive/zip: reduce CPU usage in
5 index construction
6MIME-Version: 1.0
7Content-Type: text/plain; charset=UTF-8
8Content-Transfer-Encoding: 8bit
9
10Constructing the zip index (which is done once when first opening
11a file in an archive) can consume large amounts of CPU when
12processing deeply-nested directory paths.
13
14Switch to a less inefficient algorithm.
15
16Thanks to Jakub Ciolek for reporting this issue.
17
18 goos: darwin
19 goarch: arm64
20 pkg: archive/zip
21 cpu: Apple M4 Pro
22 │ /tmp/bench.0 │ /tmp/bench.1 │
23 │ sec/op │ sec/op vs base │
24 ReaderOneDeepDir-14 25983.62m ± 2% 46.01m ± 2% -99.82% (p=0.000 n=8)
25 ReaderManyDeepDirs-14 16.221 ± 1% 2.763 ± 6% -82.96% (p=0.000 n=8)
26 ReaderManyShallowFiles-14 130.3m ± 1% 128.8m ± 2% -1.20% (p=0.003 n=8)
27 geomean 3.801 253.9m -93.32%
28
29Fixes #77102
30Fixes CVE-2025-61728
31
32CVE: CVE-2025-61728
33Upstream-Status: Backport [https://github.com/golang/go/commit/3235ef3db85c]
34
35Change-Id: I2c9c864be01b2a2769eb67fbab1b250aeb8f6c42
36Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/3060
37Reviewed-by: Nicholas Husin <husin@google.com>
38Reviewed-by: Neal Patel <nealpatel@google.com>
39Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/3328
40Reviewed-by: Damien Neil <dneil@google.com>
41Reviewed-on: https://go-review.googlesource.com/c/go/+/736703
42TryBot-Bypass: Michael Pratt <mpratt@google.com>
43Auto-Submit: Michael Pratt <mpratt@google.com>
44Reviewed-by: Junyang Shao <shaojunyang@google.com>
45(cherry picked from commit 3235ef3db85c2d7e797b976822a7addaf6d5ca2a)
46Signed-off-by: Deepak Rathore <deeratho@cisco.com>
47---
48 src/archive/zip/reader.go | 11 ++++-
49 src/archive/zip/reader_test.go | 81 ++++++++++++++++++++++++++++++++++
50 2 files changed, 91 insertions(+), 1 deletion(-)
51
52diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go
53index 60b34b76ee..8a79f5d140 100644
54--- a/src/archive/zip/reader.go
55+++ b/src/archive/zip/reader.go
56@@ -830,7 +830,16 @@ func (r *Reader) initFileList() {
57 continue
58 }
59
60- for dir := path.Dir(name); dir != "."; dir = path.Dir(dir) {
61+ dir := name
62+ for {
63+ if idx := strings.LastIndex(dir, "/"); idx < 0 {
64+ break
65+ } else {
66+ dir = dir[:idx]
67+ }
68+ if dirs[dir] {
69+ break
70+ }
71 dirs[dir] = true
72 }
73
74diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go
75index 9a77c1aa62..278714bf49 100644
76--- a/src/archive/zip/reader_test.go
77+++ b/src/archive/zip/reader_test.go
78@@ -8,6 +8,7 @@ import (
79 "bytes"
80 "encoding/binary"
81 "encoding/hex"
82+ "fmt"
83 "internal/obscuretestdata"
84 "io"
85 "io/fs"
86@@ -1834,3 +1835,83 @@ func TestBaseOffsetPlusOverflow(t *testing.T) {
87 // as the section reader offset & size were < 0.
88 NewReader(bytes.NewReader(data), int64(len(data))+1875)
89 }
90+
91+func BenchmarkReaderOneDeepDir(b *testing.B) {
92+ var buf bytes.Buffer
93+ zw := NewWriter(&buf)
94+
95+ for i := range 4000 {
96+ name := strings.Repeat("a/", i) + "data"
97+ zw.CreateHeader(&FileHeader{
98+ Name: name,
99+ Method: Store,
100+ })
101+ }
102+
103+ if err := zw.Close(); err != nil {
104+ b.Fatal(err)
105+ }
106+ data := buf.Bytes()
107+
108+ for b.Loop() {
109+ zr, err := NewReader(bytes.NewReader(data), int64(len(data)))
110+ if err != nil {
111+ b.Fatal(err)
112+ }
113+ zr.Open("does-not-exist")
114+ }
115+}
116+
117+func BenchmarkReaderManyDeepDirs(b *testing.B) {
118+ var buf bytes.Buffer
119+ zw := NewWriter(&buf)
120+
121+ for i := range 2850 {
122+ name := fmt.Sprintf("%x", i)
123+ name = strings.Repeat("/"+name, i+1)[1:]
124+
125+ zw.CreateHeader(&FileHeader{
126+ Name: name,
127+ Method: Store,
128+ })
129+ }
130+
131+ if err := zw.Close(); err != nil {
132+ b.Fatal(err)
133+ }
134+ data := buf.Bytes()
135+
136+ for b.Loop() {
137+ zr, err := NewReader(bytes.NewReader(data), int64(len(data)))
138+ if err != nil {
139+ b.Fatal(err)
140+ }
141+ zr.Open("does-not-exist")
142+ }
143+}
144+
145+func BenchmarkReaderManyShallowFiles(b *testing.B) {
146+ var buf bytes.Buffer
147+ zw := NewWriter(&buf)
148+
149+ for i := range 310000 {
150+ name := fmt.Sprintf("%v", i)
151+ zw.CreateHeader(&FileHeader{
152+ Name: name,
153+ Method: Store,
154+ })
155+ }
156+
157+ if err := zw.Close(); err != nil {
158+ b.Fatal(err)
159+ }
160+ data := buf.Bytes()
161+
162+ for b.Loop() {
163+ zr, err := NewReader(bytes.NewReader(data), int64(len(data)))
164+ if err != nil {
165+ b.Fatal(err)
166+ }
167+ zr.Open("does-not-exist")
168+ }
169+}
170--
1712.35.6