Skip to content

Go 1.27.2 - #191

Merged
bradfitz merged 44 commits into
tailscale.go1.27from
bradfitz/go1.27.2
Oct 9, 2026
Merged

bradfitz merged 44 commits into
tailscale.go1.27from
bradfitz/go1.27.2

Conversation

@bradfitz

@bradfitz bradfitz commented Oct 9, 2026

Copy link
Copy Markdown
Member

Update to Go 1.27.2

  • [release-branch.go1.27] runtime: don't add the itabs of a plugin twice
  • [release-branch.go1.27] cmd/compile: correctly mark interface calls as used for tail call wrappers
  • [release-branch.go1.27] cmd/compile: fix large riscv64 move/zero
  • [release-branch.go1.27] encoding/json: avoid calling MarshalText on named string map keys
  • [release-branch.go1.27] net/http: fix HTTP/1 deadlock on concurrent response body Read and Close
  • [release-branch.go1.27] net/http: read Response before signaling eofc in readLoop
  • [release-branch.go1.27] net/http: return nil from Body.Close after a failed Read
  • [release-branch.go1.27] net/http: discard trailer when draining a response body
  • [release-branch.go1.27] net/http/internal/http2: delete malformed framing-related headers
  • [release-branch.go1.27] internal/runtime/syscall/linux: sync EpollEvent with the kernel header
  • [release-branch.go1.27] cmd/compile: don't stack-allocate a slice whose element interior escapes
  • [release-branch.go1.27] os: handle unsupported OBJ_DONT_REPARSE on older Windows
  • [release-branch.go1.27] compress/flate: do not emit the preset dictionary into the output
  • [release-branch.go1.27] runtime: keep the working directory for non-bundled ios/arm64 binaries
  • [release-branch.go1.27] testing: escape framing markers only in test2json mode
  • [release-branch.go1.27] cmd/compile: call racefuncexit before a tail call
  • [release-branch.go1.27] cmd: vendor changes for "go fix"
  • [release-branch.go1.27] cmd/compile: support unified V5 export data (method indices)
  • [release-branch.go1.27] os: preserve completion notification modes for NewFile handles
  • [release-branch.go1.27] cmd/go: include VetxOnly in the vet action ID
  • [release-branch.go1.27] encoding/json/v2: avoid setting with errors parsing float
  • [release-branch.go1.27] net/http: populate Request.TLS from HTTP/2 connection state
  • [release-branch.go1.27] encoding/json: fix UnsupportedValueError.Value regression
  • [release-branch.go1.27] cmd/compile: use a 32-bit type for rewritten rotate amounts
  • [release-branch.go1.27] cmd/internal/obj/ppc64: fix async preempt safepoint bug
  • [release-branch.go1.27] runtime: create Windows threads on the system stack
  • [release-branch.go1.27] cmd/cover: preserve statement counts when splitting coverage blocks
  • [release-branch.go1.27] cmd/link: pass -no_fixup_chains to C linker when building plugin on macOS
  • [release-branch.go1.27] html/template: reset JS context for template expressions
  • [release-branch.go1.27] html/template: recognize yield as regexp preceder keyword
  • [release-branch.go1.27] cmd/go: bundle go.sum h1 hashes for golang.org/fips140
  • [release-branch.go1.27] cmd/go: always verify toolchain downloads with sumdb
  • [release-branch.go1.27] crypto/tls: validate ECH outer extension references
  • [release-branch.go1.27] net/textproto: enforce MIME memory limit on first line
  • [release-branch.go1.27] net/http, net/http/httputil: avoid post-CONNECT pool corruption
  • [release-branch.go1.27] net/http: avoid server reuse of connection after CONNECT
  • [release-branch.go1.27] os: correct Root junction handling on Windows (avoid mkdir escape)
  • [release-branch.go1.27] net/http: limit the size of range headers parsed in ServeContent
  • [release-branch.go1.27] net/http/internal/http2: avoid excessive work on initial window changes
  • [release-branch.go1.27] net/http/internal/http2: avoid 2x refund on stream close with buffered data
  • [release-branch.go1.27] net/http/internal/http2: prevent crash due to HPACK encoder race
  • [release-branch.go1.27] net/http: apply header limits to Trailer headers too
  • [release-branch.go1.27] go1.27.2

dims and others added 30 commits September 15, 2026 07:28
CL 729201 removed itablinks. The runtime now walks the itab section of
a module when it starts and when it loads a plugin. A plugin has its own
copy of the itabs that the main program also has. Before CL 729201,
dynamic symbol resolution pointed the itablinks entries of the plugin
at the itabs of the main program, so add skipped them. Now add puts the
copies of the plugin into the table as second entries for the same
interface/type pairs.

Type switches and type assertions compare the itab pointer of a value
with the itab that the linker put into the module. In the plugin, that
itab also resolves to the copy of the main program. After the itab table
grows and rehashes its entries, find can return the copy of the plugin,
and type switches in the main program take the default case. With Go
1.27, golangci-lint panics in go/ast.Walk with "unexpected node type
*ast.DeferStmt" after it loads its third linter plugin
(kubernetes/kubernetes#141663).

Make add skip an itab when the table already has one for the same
interface/type pair.

For golang#81303
Fixes golang#81324

Change-Id: Ia78e597fff9fd870924c1ebc94453523f3e7578b
Reviewed-on: https://go-review.googlesource.com/c/go/+/826244
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Jordan Liggitt <liggitt@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
(cherry picked from commit 2d04c9d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/827664
…s used for tail call wrappers

CL 751465 updated the compiler to use tail calls for embedded interface
wrappers, but the underlying interface calls were not marked as used. As
a result, the linker incorrectly drops the callee via DCE, triggering an
unreachable method runtime panic.

This change fixes the issue by marking the interface calls as used when
walking tail call nodes.

Fixes golang#81353

Change-Id: I3d433b645f95179698c4b739c89a4e9a2c908604
Reviewed-on: https://go-review.googlesource.com/c/go/+/827624
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/830505
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
We were packing the size into an int32, which isn't valid
for really large move/zero. Instead, put the alignment in the
aux field so we can use the entire auxint field for the size.

Cherry pick of CL 824984 (the main one) and CL 827324 (a small fixup).

Fixes golang#81296

Change-Id: I552a5fc990a6fc1fcc4c72cd2d532011952e83e5
Reviewed-on: https://go-review.googlesource.com/c/go/+/828865
Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Joel Sing <joel@sing.id.au>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
…amed string map keys

In Go 1.26, MarshalText methods were never called on named string map keys,
while it is called after the switch to using the v2 implementation.
Adjust the legacy compatibility layer to preserve historical behavior.

Updates golang#81355
Fixes golang#81362

Change-Id: I0bcc85da4bf933acebd7e2736d0f820c62f2201d
Reviewed-on: https://go-review.googlesource.com/c/go/+/827864
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit 714d9af)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832764
…esponse body Read and Close

In HTTP/1, if we close a response body early prior to EOF, while
allowing a concurrent read to happen, a deadlock will occur if the read
reaches EOF. This is because both calls wait on the same eofc channel,
and the persistConn readLoop only sends one value to the channel. This
problem only occurs after the implementation of automatic response body
draining; prior to that, closing the response body early will cause the
eofc channel to be closed, unblocking all calls.

Fix this by making sure that bodyEOFSignal.earlyCloseFn and
bodyEOFSignal.fn are mutually exclusive.

Additionally, disambiguate between when a response body has been closed
early vs when reading it returns a non-EOF error. Otherwise, when the
body read returns a non-EOF error, persistConn readLoop will linger
around trying to send to eofc until the response body is closed rather
than exiting immediately.

For golang#81404
Fixes golang#81411

Change-Id: I706ba39afd08b605fa80bb9d99114f4f6a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/829984
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit e51216d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/830424
… in readLoop

CL 829984 changed how readLoop waits for the caller to finish with a
response body that is closed before EOF. In the errClosedEarly case it
now sends on eofc first and reads resp.ContentLength after. The send is
what lets the caller's Body.Close return, and the Response belongs to
the caller from then on. Before CL 829984 the read came first, while
the caller was still blocked in Close.

Any caller that modifies the Response after closing its body races with
that read. httputil.ReverseProxy.ModifyResponse callbacks that close
the backend body and replace *resp do exactly that, and Kubernetes'
apiserver proxy tests now fail under -race on Go tip
(kubernetes/kubernetes#142079).

Read ContentLength before signaling eofc, as before.

For golang#81510
Fixes golang#81515

Change-Id: I900d92bed6c7cc34384ec483da07c3694cdf0012
Reviewed-on: https://go-review.googlesource.com/c/go/+/831964
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Nicholas Husin <nsh@golang.org>
Reviewed-by: Nicholas Husin <husin@google.com>
Auto-Submit: Nicholas Husin <nsh@golang.org>
(cherry picked from commit 08cff59)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832344
Reviewed-by: Damien Neil <dneil@google.com>
…failed Read

CL 829984 made bodyEOFSignal.condfn clear earlyCloseFn as well as fn.
After a Read that returns a non-EOF error, Close therefore no longer
takes the earlyCloseFn path, which returned nil. It falls through to
(*body).Close, whose drain reads the body again, gets the same sticky
error, and returns it. Before CL 829984 Close returned nil here.

Callers that check the error from Close now see the Read error twice.
Kubernetes' apiserver tests assert Close() == nil after an aborted
response and fail on Go tip with "tls: bad record MAC" and "unexpected
EOF" from Close (kubernetes/kubernetes#142079).

Skip the drain when rerr is a non-EOF error and return nil; readLoop
has already given up the connection. Unlike the old earlyCloseFn path
this does not wait for readLoop to exit, but the connection is being
torn down either way.

CL 829984 added a TestTransportResponseBodyDrainReadAndClose case that
expects the Read error from Close; this changes it to expect nil.

For golang#81511
Fixes golang#81516

Change-Id: Ic3a8ff893230002bed2637c9b4ad4f524e25e831
Reviewed-on: https://go-review.googlesource.com/c/go/+/832464
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Nicholas Husin <husin@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
…ponse body

When a server sends trailers, transport will automatically populate
Response.Trailer upon reading the response body to EOF. When a user
closes the response body early, it is possible that the transport will
automatically drain the response body to EOF, and populate
Response.Trailer at the same time as when a user might access it,
resulting in a race condition.

This is probably a pretty unlikely scenario, as reading trailers without
reading a response body to completion does not really make sense (it
will always be empty). It is nonetheless worth fixing.

For golang#81521
Fixes golang#81522

Change-Id: Id0411a4c198a6fc7bfb7c97d550d57666a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/832264
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Nicholas Husin <husin@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit eeb35e6)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832444
…ming-related headers

Historically, we have been rather lax about malformed framing-related
headers in our HTTP/2 implementation, as they cannot interfere with
HTTP/2 framing. However, this makes it possible for our HTTP/2
implementation to forward responses containing such headers to an HTTP/1
client when acting as a reverse proxy. If the HTTP/1 client also does
not behave strictly enough, this can result in response smuggling.

Therefore, delete malformed framing-related headers in our HTTP/2
transport, so they will not be forwarded to a potentially vulnerable
HTTP/1 client.

Thank you to TJ Barton for reporting this issue.

For golang#81115
Fixes golang#81585
Fixes CVE-2026-78660

Change-Id: I43e1d124c1672549e47efa08756772836a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/836525
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
…nt with the kernel header

include/uapi/linux/eventpoll.h packs struct epoll_event only on amd64,
so data is a plain __u64 everywhere else. Most ports copied the packed
amd64 declaration anyway, which on the 64-bit ports was a bug: [8]byte
is 1-aligned, leaving the struct 4-aligned while runtime.netpoll reads
the field as a uintptr load that cause unaligned access on mips64x.

Fixes golang#81437

Change-Id: Ia584f62e716dc49f880bd8df2ac877f97947f415
Reviewed-on: https://go-review.googlesource.com/c/go/+/819660
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
(cherry picked from commit 1190f7d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/838365
Reviewed-by: Mark Freeman <mark@golang.org>
…se element interior escapes

The slice backing store pass counts s[i] as exclusivity-preserving, so
it gives up when it sees &s[i]. But that check only matched an OADDR
directly over an OINDEX, so &s[i].f slipped through with an ODOT in
between, and the backing store stayed in the frame while a pointer into
it was returned.

To fix this, walk down the field selectors and array indexes under an
OADDR to find the object actually being addressed. ODOTPTR, ODEREF and
indexing through a pointer to an array reach a different object, so the
walk stops there.

Fixes golang#81667

Change-Id: If8a105eab1f596901d8148fa9d2376669737f77d
Reviewed-on: https://go-review.googlesource.com/c/go/+/836025
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
(cherry picked from commit 2b9e678)
Reviewed-on: https://go-review.googlesource.com/c/go/+/837085
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
…der Windows

Windows 10 build 10240 rejects NtCreateFile calls using OBJ_DONT_REPARSE
with STATUS_INVALID_PARAMETER. This breaks os.Root operations and,
since CL 661575, recursive RemoveAll calls.

When this occurs, retry single-component relative opens with
FILE_OPEN_REPARSE_POINT and inspect the opened handle before truncation
or enabling delete-on-close. For delete-on-close, reopen the validated
file through its handle to avoid resolving the pathname again.

Root and RemoveAll already walk paths one component at a time, so this
fallback preserves their no-follow protections without implementing
general multi-component traversal.

Fixes golang#81402.
Updates golang#78131.

Change-Id: Idc766a8e8368062d5e9c73bbbc2de7b894a10e40
Reviewed-on: https://go-review.googlesource.com/c/go/+/828644
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
(cherry picked from commit 59ea07b)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832804
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
…nary into the output

When using a dictionary, fillWindow was not setting blockStart, which
caused a non-compressed block in first position to write the dictionary.
This mixup can happen because window stores both the look back window
and the block we are about to write. Set blockStart to skip over the
dictionary if we have to write the window.

For golang#80538
Fixes golang#81233

Change-Id: I6e6784696f29591f2819fc3c9c461d73d3d6335b
GitHub-Last-Rev: 469f26b
GitHub-Pull-Request: golang#80539
Reviewed-on: https://go-review.googlesource.com/c/go/+/804680
Auto-Submit: Jorropo <jorropo.pgm@gmail.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Mark Freeman <markfreeman@google.com>
(cherry picked from commit 655a713)
Reviewed-on: https://go-review.googlesource.com/c/go/+/829764
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Klaus Post <klauspost@gmail.com>
…undled ios/arm64 binaries

CL 769360 replaced CFBundleCopyResourceURL(Info.plist) with
CFBundleCopyBundleURL when porting the ios/arm64 working directory setup
from C to Go. The old call returned NULL for an executable that is not
inside an app bundle, and that suppressed the chdir. CFBundleCopyBundleURL
returns the directory holding the executable instead, so an ios/arm64
binary run outside an app bundle now chdirs there at startup and loses the
working directory it inherited. cmd/go built for ios/arm64 no longer finds
go.mod as a result.

Restore the Info.plist check as the condition for the chdir, keeping
CFBundleCopyBundleURL for the path itself.

Updates golang#81465
Fixes golang#81469

Change-Id: I1b55ac476340176753dde19b65e28e37c896a260
Reviewed-on: https://go-review.googlesource.com/c/go/+/830864
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Quim Muntal <quimmuntal@gmail.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
(cherry picked from commit 16e9662)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832224
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Mark Freeman <mark@golang.org>
…json mode

Fix ANSI escape sequence corruption (ESC doubling) in t.Log output
in plain (-test.v) mode introduced by CL 751940.

For golang#81577
Fixes golang#81580

Change-Id: I968ac99d46280be16d88e867b8b6c651816715cf
Reviewed-on: https://go-review.googlesource.com/c/go/+/834264
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Sean Liao <sean@liao.dev>
Reviewed-on: https://go-review.googlesource.com/c/go/+/837405
Reviewed-by: Michael Matloob <matloob@google.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Mark Freeman <mark@golang.org>
…call

The OTAILCALL path ends its block with BlockRetJmp and never goes
through state.exit, which is the only place that emits a call to
runtime.racefuncexit. So a compiler-generated wrapper that ends in a
tail call tells the race detector that it was entered but never that it
returned, leaking an entry in the race detector's shadow stack on every
call.

To fix this, just emitting racefuncexit before the tail call.

Fixes golang#81666

Change-Id: I4c3344d10ca239db1669ecf133704dd6cebca11b
Reviewed-on: https://go-review.googlesource.com/c/go/+/832244
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
(cherry picked from commit cd6dd4c)
Reviewed-on: https://go-review.googlesource.com/c/go/+/836989
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Pull in changes from x/tools that affect go fix.

Fixes golang#81389
Updates golang#81306

Change-Id: I195cfe8b5677fe977980869a93e28d99bebdf82c
Reviewed-on: https://go-review.googlesource.com/c/go/+/837585
Reviewed-by: Mark Freeman <mark@golang.org>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
…method indices)

Unified V4 (go1.27.0) encoded nongeneric methods followed by
generic methods, losing the source order of methods on a
named type, breaking objectpath, and causing crashes (see golang#81188).

This changes support for unified v5 (encoding in cmd/compile,
decoding in go/internal). Once this is released in go1.27.0,
applications built with the latest x/tools decoder will not
crash.

See CL 826064 for the x/tools unified V5 decoder.

Updates golang#81188
Fixes golang#81306

Change-Id: I48073fde7af282addd128c536913511a171f9053
Reviewed-on: https://go-review.googlesource.com/c/go/+/826105
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-on: https://go-review.googlesource.com/c/go/+/842385
Reviewed-by: Michael Pratt <mpratt@google.com>
…r NewFile handles

On Windows, handles to the same file object share completion
notification modes. NewFile doesn't know who else is using the file
object, so changing these modes can break their I/O, even in another
process.

For NewFile, leave the modes alone and check the skip-success flag so we
know whether to wait for IOCP completions.

Updates golang#80979
Fixes golang#81374

Change-Id: I9b84ad42d373b918a733aff180beb71b96474136
Reviewed-on: https://go-review.googlesource.com/c/go/+/828584
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
(cherry picked from commit d889729)
Reviewed-on: https://go-review.googlesource.com/c/go/+/832784
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Quim Muntal <quimmuntal@gmail.com>
Vetting a package only as a dependency (VetxOnly) computes facts but
reports no diagnostics. Its empty output was cached under the same
action ID as a full vet of that package, so a later go vet of the
package replayed the empty output and missed its findings.

For golang#81757
Fixes golang#81861

Change-Id: Ibedaccaa4d344d7858ea8261a98106ead3a8e89a
Reviewed-on: https://go-review.googlesource.com/c/go/+/839445
Auto-Submit: Alan Donovan <adonovan@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
(cherry picked from commit 77881b0)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842065
Reviewed-by: Mark Freeman <mark@golang.org>
…arsing float

If there is an error parsing a float (e.g., overflow)
avoid setting the value.
This matches the behavior for ints and uints.

Updates golang#81062
Fixes golang#81084

Change-Id: I79be95d120cae44cf55fd943c428834b9e3a9425
Reviewed-on: https://go-review.googlesource.com/c/go/+/820580
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
(cherry picked from commit 94b71ff)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842145
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Joseph Tsai <joetsai@digital-static.net>
…nnection state

The HTTP/2 server only sets Request.TLS for requests with an https
:scheme. This leaves it nil for requests to http targets through a TLS
proxy, and for CONNECT requests, which omit :scheme.

In Go 1.27, CL 765360 started calling the internal HTTP/2 server directly,
bypassing initALPNRequest, which previously filled in a missing TLS state.
This exposed the scheme-dependent initialization to net/http handlers.

Request.TLS describes the connection on which a request was received,
while :scheme describes the request target. Set Request.TLS from the
connection state regardless of the scheme. Unencrypted connections
continue to have a nil TLS state.

Test https and http targets and CONNECT requests over both TLS and
unencrypted HTTP/2 connections.

For golang#81384
Fixes golang#81816

Change-Id: Ibbb98dbe7183ac29b727aea30f989bf5e85a4242
Reviewed-on: https://go-review.googlesource.com/c/go/+/829184
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
(cherry picked from commit a14b543)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842445
Reviewed-by: Mark Freeman <mark@golang.org>
…e regression

In Go1.27, where v1 is now implemented using v2,
the UnsupportedValueError.Value field was no longer populated.
However, there are reports that code depends on this field,
so populate it in the compatibility shim layer.

For golang#81176
Fixes golang#81229

Change-Id: Iaa18d9ed2978014e00c8825bf6da901cc92c4062
Reviewed-on: https://go-review.googlesource.com/c/go/+/824384
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
(cherry picked from commit 1903bc2)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842008
Reviewed-by: Mark Freeman <mark@golang.org>
…rotate amounts

On a 32-bit platform a Const64 rotate amount is rewritten to a Const32,
but the new value kept the original 64-bit type. The rule that folds a
rotate of a rotate compares the two amounts by type size, so it saw two
8-byte amounts and combined them with an Add64. decompose builtin then
split that Add64 into an Int64Lo of a Const32, which no dec64 rule
matches, and the compiler failed with "not lowered".

For golang#81687
Fixes golang#81706

Change-Id: I2ad709c57ea7a59bcee6978459904a5a5300595d
Reviewed-on: https://go-review.googlesource.com/c/go/+/837245
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Auto-Submit: Jorropo <jorropo.pgm@gmail.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
(cherry picked from commit 6b3800e)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842565
…epoint bug

Frameless tail calls end with MOVD Rx, CTR; BR (CTR),
but the compiler was not marking the point between
those two instructions as unsafe for async preempt.
The async preempt fundamentally smashes CTR
(it needs some register to jump to, and LR is taken),
so we have to mark the sequence as not-async-safe.

This is the root cause of many linux-ppc64le flakes
on the issue tracker.

Reproduced using qemu-ppc64le with 1-instruction
basic block translation (repro program on golang#78576).

For golang#78576.
For golang#78199.
For golang#78821.
For golang#78897.
For golang#78915.
Fixes golang#81818.

Change-Id: I1bf851c3461160d1a685e189f518be766a6a6964
Reviewed-on: https://go-review.googlesource.com/c/go/+/821480
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit f0fb6be)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842465
Reviewed-by: Mark Freeman <mark@golang.org>
… stack

LockOSThread call can reach newosproc on a goroutine stack while
starting the template thread. CL 746300 changed newosproc from stdcall,
which switches to the system stack, to createThread, which uses
stdcall_no_g and does not switch stacks. Native CreateThread code can
then overrun the goroutine stack and corrupt adjacent memory.

Run createThread on the system stack, including its retry loop.

Updates golang#81731
Fixes golang#81829

Change-Id: I41e7083bb916c86c7411718d9506d8fa777e2d5e
Reviewed-on: https://go-review.googlesource.com/c/go/+/840525
Reviewed-by: Mark Freeman <mark@golang.org>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: David Chase <drchase@google.com>
(cherry picked from commit 9a5f58a)
Reviewed-on: https://go-review.googlesource.com/c/go/+/841305
Reviewed-by: Cherry Mui <cherryyz@google.com>
…itting coverage blocks

The comment and blank-line filtering in cmd/cover can split a
straight-line basic block into multiple coverage ranges.

The statement count passed to newCounter was still the count of the
entire basic block, so every split range received the same NumStmt
value. This duplicated statements in coverage profiles and inflated
reported statement coverage.

Count the statements belonging to each range before emitting its
counter. Add a regression test covering a block split into multiple
ranges.

For golang#80974
Fixes golang#81832

Change-Id: I872cda3a4ba401764c700d3a36ad93fd6cacd38d
Reviewed-on: https://go-review.googlesource.com/c/go/+/819000
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
(cherry picked from commit d67021d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842585
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: shuang cui <imcusg@gmail.com>
…hen building plugin on macOS

The dynamic linker in macOS 27 checks the number of segments
recorded in the LC_DYLD_CHAINED_FIXUPS load command, and reject
the shared object when there is a mismatch. When combining DWARF,
we add a segment but currently don't fix up the recorded number.
Pass -no_fixup_chains to the C linker, so it doesn't use
LC_DYLD_CHAINED_FIXUPS.

This is a minimal workaround that we can backport to Go 1.26 and
Go 1.27. Long term, we should emit split DWARF (golang#62577).

Updates golang#81793.
Fixes golang#81890.

Change-Id: I991e046348db9250b8d583b633d5502b1cf3502a
Reviewed-on: https://go-review.googlesource.com/c/go/+/841665
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit 01e4798)
Reviewed-on: https://go-review.googlesource.com/c/go/+/842007
Reviewed-by: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
…expressions

Ensure that regular expressions at the start
of each expression receive regular expression
escaping.

Fixes CVE-2026-94448
For golang#81821
Fixes golang#81924

Change-Id: Ia0bcb01f38d011035553a46375748d7433185889
Reviewed-on: https://go-review.googlesource.com/c/go/+/839866
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit cb1e5f4)
Reviewed-on: https://go-review.googlesource.com/c/go/+/843225
Reviewed-by: Michael Pratt <mpratt@google.com>
…eceder keyword

Ensure that yield receives regular expression
escaping when used as a keyword. Similarly,
ensure that non-keyword uses are not escaped.

A trusted template author has no reason to
write `await` followed by a regular expression
since they are not a promise; additionally,
there is no valid JS+html/template context
in which `default` followed by a regular
expression is plausibly correct.

Fixes CVE-2026-97030
For golang#81823
Fixes golang#81910

Change-Id: I5dc76cf958cdc2a43d02c8683da589aff1296225
Reviewed-on: https://go-review.googlesource.com/c/go/+/840925
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
(cherry picked from commit 47cf464)
Reviewed-on: https://go-review.googlesource.com/c/go/+/843645
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
thatnealpatel and others added 14 commits October 2, 2026 11:37
…g/fips140

Instead of providing a carve-out for the
golang.org/fips module, add the canonical
go.sum h1 hash to its trusted fips140.sum
file.

When a modfetch would normally see this
bundled module, use the trusted ziphash
in fips140.sum to populate its entry in
the GOMODCACHE.

Fixes CVE-2026-94444
For golang#81833
Fixes golang#81912

Change-Id: Ib8ebf0837e56fb8825e4526a7114b61ac843fd0b
Reviewed-on: https://go-review.googlesource.com/c/go/+/843646
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
…h sumdb

Instead of allowing a matching entry
that specifies golang.org/toolchain,
always go to the network to obtain
the canonical checksum.

Fixes CVE-2026-94447
For golang#81834
Fixes golang#81914

Change-Id: I5bffb80f7f18e3c1ac7b5e7ef027a4acf1f2a7e1
Reviewed-on: https://go-review.googlesource.com/c/go/+/843587
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
…rences

Using a single cursor, reject malformed encodings
and esnure that each outer extension is copied at
most once.

Fixes CVE-2026-97031
For golang#81855
Fixes golang#81916

Change-Id: I5b09f2b6275d42f7701fae4e583eb3a2caeaa44d
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5320
Reviewed-by: Roland Shoemaker <bracewell@google.com>
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6140
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847025
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Gopher Robot <gobot@golang.org>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
…irst line

readMIMEHeader subtracted 400 bytes from its maxMemory parameter,
for overhead accounting, but did not check to see if this caused
maxMemory to become negative. When called with a small maxMemory
limit, this disabled the memory limit (<0: unlimited) for the
first line read.

Drop the 400 byte adjustment entirely, as serving no useful
purpose: If the caller wants to deduct some amount per MIMEHeader,
they may do so.

Thanks to Jakub Ciolek (https://ciolek.dev) for reporting this issue.

Fixes CVE-2026-94440
For golang#81741
Fixes golang#81902

Change-Id: I0f42d331b2355346b07d1b9987a488996a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5680
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6141
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847026
Auto-Submit: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
…CT pool corruption

When the HTTP/1 transport sends a CONNECT request, it sends the
Request.Body along with the headers.

CONNECT requests do not contain data.

If the server accepts the CONNECT, the Request.Body becomes the
outbound tunneled data. If the server rejects the CONNECT, however,
the Request.Body becomes the start of a new request on the connection.
The transport improperly returns the connection to the pool. If the
data on the connection is a valid request, the next request sent
on the connection will read the response to that prior request.

There are a number of problems in net/http's handling of CONNECT
requests. This CL is a minimal change to avoid exploitable misbehavior
in the transport.

  - Transport closes a connection after making a CONNECT request,
    regardless of the response it gets.
  - ReverseProxy rejects CONNECT requests with 405 Method Not Allowed.

Thanks to Xclow3n (Rajat Raghav) for reporting this issue.

Fixes CVE-2026-56866
For golang#81740
Fixes golang#81900

Change-Id: Ie101b9345a9c4b3525476c0627fa0b736a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5640
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6180
Reviewed-on: https://go-review.googlesource.com/c/go/+/847027
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
…ter CONNECT

When a server HTTP handler responds to an HTTP/1 CONNECT request
with a 2xx response and returns without taking ownership of (hijacking)
the connection, the server incorrectly continues to read requests
from the connection.

Since a 2xx response to a CONNECT converts the connection into
a tunnel, this can result in parser misalignment between the net/http
server and intermediate proxies, and a potential request smuggling
vector.

There are a number of problems in net/http's handling of CONNECT
requests. This CL is a minimal change to avoid exploitable misbehavior
in the server.

The HTTP/1 server now always closes a connection after handling a
CONNECT request, if the handler did not hijack the connection.

Thanks to Jakub Ciolek (https://ciolek.dev) for reporting this issue.

Fixes CVE-2026-94439
For golang#81744
Fixes golang#81908

Change-Id: I260f23ca8c8fbe51abb2bdfef5afb2d96a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5641
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6142
Reviewed-on: https://go-review.googlesource.com/c/go/+/847028
Auto-Submit: Gopher Robot <gobot@golang.org>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
… (avoid mkdir escape)

Avoid an escape from the root on Windows when the target of Root.Mkdir
or Root.MkdirAll is a dangling junction. This would incorrectly create
a new directory at the target of the junction, even when this is a
location outside of the root.

Also fix a more minor issue where various operations on a junction
would fail when the target name ended in a trailing slash. For example,
Root.Lstat("target/") would return ENOTDIR when "target" is a junction,
instead of following the junction or returning a path-escapes error.

Thanks to Daniele Ballarini for reporting this issue.

Fixes CVE-2026-56857
For golang#81739
Fixes golang#81898

Change-Id: If92a6b425ff33af6fb05c94b0d3d98e26a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5580
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6200
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847029
Auto-Submit: Gopher Robot <gobot@golang.org>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
…sed in ServeContent

Set a limit on the number of ranges in a Range header,
avoiding excessive allocations/CPU when parsing a header
containing a large number of small ranges.

The limit is controlled by GODEBUG=httpservecontentmaxranges.
The default is 200 (same as Apache).
GODEBUG=httpservecontentmaxranges=0 disables the limit.

Thanks to Jakub Ciolek (https://ciolek.dev) for reporting this issue.

Fixes CVE-2026-78667
For golang#81858
Fixes golang#81920

Change-Id: Id7df8059e2a406e3a401bb5cb767b4d16a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5560
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6220
Reviewed-on: https://go-review.googlesource.com/c/go/+/847030
Reviewed-by: Michael Pratt <mpratt@google.com>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Gopher Robot <gobot@golang.org>
… on initial window changes

Defend against a malicious peer sending many adjustments to the initial
flow control window.

The flow control window for a stream is:
  initial_window + sum(window_updates) - sum(bytes_sent)

The initial window starts at 64k, but may be adjusted at any time
by a SETTINGS frame.

A decrease in the initial window might cause a stream's current
window to become negative, which is fine.  (This happens when a
stream has already consumed some portion of its existing window.)

An increase in the initial window MUST NOT cause the window of
any stream to exceed the maximum of (2^31-1). RFC 9113 requires
us to check for this:

	An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE
	that causes any flow-control window to exceed the maximum size as
	a connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR.

We enforced this by iterating over every active stream to adjust its
window and verify that the new window is not too large. While iterating
over streams is O(N), a malicious peer could send many small SETTINGS frames
and cause a large amount of CPU consumption when the number of open
streams is high.

The new implementation enforces the window less strictly, but performs
O(1) work in response to a change in the initial window.
Individual streams now maintain a delta from the initial window:

  delta = sum(window_updates) - sum(bytes_sent)

The current stream window is computed on-demand by adding the
current initial window to the delta.

Overflow is detected lazily, when trying to write data for a stream
or when processing a WINDOW_UPDATE. This is technically speaking
a violation of RFC 9113's requirements, but it's a harmless one
and ensures we never do excessive work in reaction to a change
in the initial window.

Alternatives considered:

- Maintain a heap of streams, sorted by current window size.
  Too complicated. Too much overhead. The juice is not worth the squeeze.

- Maintain a high-water mark for the stream delta, and only do an O(N)
  iteration over all streams when the high-water mark indicates that
  overflow might have happened. Avoids expensive processing in most
  cases, but is vulnerable to a peer sending a rapid sequence of:

    create stream
    update stream window (updating the high-water mark)
    reset stream
    increase initial window to cause iteration (no violation)
    decrease initial window

  This scenario is more work than just a sequence of changes to the
  initial window, and there are possibly ways to defend against it,
  but lazy overflow detection is simpler and extremely robust.

Thanks to Jakub Ciolek (https://ciolek.dev) for reporting this issue.

Fixes CVE-2026-78669
Fixes golang#81904
For golang#81742

Change-Id: I5667b01f81427141a0d873e2ec47052a6a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5921
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847031
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
…tream close with buffered data

Fix the following bug:

  - client opens a stream and sends data
  - client resets the stream, and server refunds flow control
  - handler reads the sent data, and server refunds flow control again

This double-refund allows a malicious client to exceed the server's
flow control limits, potentially causing the server to buffer much
more data than those limits should allow.

Thanks to Ali Sherif (https://www.linkedin.com/in/ali-sherif-13812b276/)
for reporting this issue.

Fixes CVE-2026-78663
Fixes golang#81906
For golang#81743

Change-Id: I86159053f7ce509d1ee93de55697f7ef6a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/6020
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847032
Reviewed-by: Michael Pratt <mpratt@google.com>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Gopher Robot <gobot@golang.org>
… HPACK encoder race

Our HTTP/2 server could end up crashing due to inadvertently
modifying its HPACK encoder concurrently. This happens because the
server modifies the HPACK encoder from two goroutines without
synchronization: one uses the encoder to encode a HEADERS frame as part
of a response sent to a client and the other modifies the encoder's
table size when handling a SETTINGS frame containing
SETTINGS_HEADER_TABLE_SIZE that a client sends.

As a result, a malicious client can repeatedly send a request while
changing the header table size to crash the server.

Fix this issue by not applying SETTINGS_HEADER_TABLE_SIZE immediately.
Instead, buffer any SETTINGS_HEADER_TABLE_SIZE received, and only apply
the new value prior to the next time the server writes a frame.

Thank you to RyotaK (https://ryotak.net) of GMO Flatt Security Inc. for
reporting this issue.

Fixes CVE-2026-97032
For golang#81867
Fixes golang#81922

Change-Id: Ife977865a8bb190ae2cf6f462979ae406a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5940
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847033
Reviewed-by: Michael Pratt <mpratt@google.com>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
…ers too

When "Trailer" headers are sent by a client, the HTTP server internally
uses the header values to populate the Request.Trailer map passed to the
server handler. Because Request.Trailer is a map, each entry incurs
memory overhead. For HTTP/2 servers, a malicious client can exploit this
by sending a "Trailer" header that declares a large number of fields,
causing the server to allocate a disproportionate amount of memory while
bypassing Server.MaxHeaderValueCount and Server.MaxHeaderBytes limits.
This exploit is not applicable for HTTP/1 servers, which do not support
multiplexing a large number of requests over one TCP connection, and
whose Server.MaxHeaderBytes is calculated differently.

Fix this by applying MaxHeaderValueCount to the trailer fields declared
in the "Trailer" header in both HTTP/1 and HTTP/2, and MaxHeaderBytes in
HTTP/2.

Thank you to RyotaK (https://ryotak.net) of GMO Flatt Security Inc. for
reporting this issue.

Fixes CVE-2026-78659
For golang#81857
Fixes golang#81918

Change-Id: I01f52e9873be80ac72d88f9e4d96f6096a6a6964
Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/5980
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Neal Patel <nealpatel@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/847034
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
Change-Id: Ic0b65cb1b99dfa414ec1c8b11360114db21b7530
Reviewed-on: https://go-review.googlesource.com/c/go/+/846986
Auto-Submit: Gopher Robot <gobot@golang.org>
TryBot-Bypass: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
@bradfitz
bradfitz merged commit 509d157 into tailscale.go1.27 Oct 9, 2026
5 checks passed
@bradfitz
bradfitz deleted the bradfitz/go1.27.2 branch October 9, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.