Skip to content

remote: release pull limiter slot when body is read to EOF - #2373

Merged
Subserial merged 2 commits into
google:mainfrom
knQzx:fix/limiter-release-on-eof
Jul 25, 2026
Merged

Subserial merged 2 commits into
google:mainfrom
knQzx:fix/limiter-release-on-eof

Conversation

@knQzx

@knQzx knQzx commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

limitedReadCloser only released its pull limiter slot in Close(), so any consumer that drains the body to EOF via io.Copy and treats that as done never gives the slot back. once every WithJobs slot leaks this way the next acquire blocks forever and pulls deadlock

this adds a Read override that releases the slot on the terminal read, since the wrapped verify.ReadCloser returns a non-nil error at EOF. the existing sync.Once keeps release idempotent, so the normal Close() path is unchanged and a read-to-EOF followed by Close() still releases exactly once

unlike patching individual call sites to always Close(), this also covers external consumers of remote that read a blob stream to EOF

fixes #2369

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 57.13%. Comparing base (0f89719) to head (11fe2b1).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2373      +/-   ##
==========================================
+ Coverage   57.11%   57.13%   +0.01%     
==========================================
  Files         166      166              
  Lines       11468    11473       +5     
==========================================
+ Hits         6550     6555       +5     
  Misses       4141     4141              
  Partials      777      777              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Subserial
Subserial merged commit b3a7149 into google:main Jul 25, 2026
22 checks passed
social4hyq pushed a commit to social4hyq/homebrew-core that referenced this pull request Sep 20, 2026
crane 0.21.8

Created-by: HarmonybrewBot
Commit-by: HarmonybrewBot
Merged-by: HarmonybrewBot
Description: Created by `brew bump`

---

Created with `brew bump-formula-pr`.<details>
  <summary>release notes</summary>
  <pre>The artifacts attached to this release are missing SLSA provenance, see #2390.

## What's Changed
* build(deps): bump the go-deps group across 1 directory with 3 updates by @dependabot[bot] in google/go-containerregistry#2353
* build(deps): bump golang.org/x/crypto from 0.45.0 to 0.52.0 in /cmd/krane by @dependabot[bot] in google/go-containerregistry#2367
* build(deps): bump golang.org/x/crypto from 0.50.0 to 0.52.0 in /pkg/authn/k8schain by @dependabot[bot] in google/go-containerregistry#2368
* build(deps): bump golang.org/x/net from 0.49.0 to 0.55.0 in /pkg/authn/kubernetes by @dependabot[bot] in google/go-containerregistry#2363
* build(deps): bump the go-deps group across 3 directories with 7 updates by @dependabot[bot] in google/go-containerregistry#2377
* build(deps): bump the actions group across 1 directory with 5 updates by @dependabot[bot] in google/go-containerregistry#2375
* Reject unsafe Windows archive paths in Extract by @Haihan-Jiang in google/go-containerregistry#2330
* feat(goreleaser): add loong64 build support for crane/gcrane/krane by @xuxiaowei-com-cn in google/go-containerregistry#2358
* Document tag and digest reference semantics by @Haihan-Jiang in google/go-containerregistry#2325
* remote: release pull limiter slot when body is read to EOF by @knQzx in google/go-containerregistry#2373
* tarball: bounds-check layer index in uncompressed LayerByDiffID by @arpitjain099 in google/go-containerregistry#2370
* authn: read Podman auth from XDG config by @vigneshakaviki in google/go-containerregistry#2379
* transport: per-host bearer token exchange on cross-host redirect by @amitzig in google/go-containerregistry#2360
* mutate: bounds-check layer index when building rebase addendums by @arpitjain099 in google/go-containerregistry#2371
* fix(daemon): copy ExposedPorts from source config in computeImageConfig by @x64vps in google/go-containerregistry#2356
* feat(remote): add WithReferrersTagFallback option by @kevinmdavis in google/go-containerregistry#2366
* mutate: apply opaque-directory whiteouts (.wh..wh..opq) in Extract by @sadmanf in google/go-containerregistry#2372
* tarball: use correct file extension for zstd/uncompressed by @milas in google/go-containerregistry#2382
* build(deps): bump github.com/moby/moby/client from 0.5.0 to 0.5.1 in the go-deps group across 1 directory by @dependabot[bot] in google/go-containerregistry#2380
* actions: update actions to be pinned by hash by @Subserial in google/go-containerregistry#2384
* Bump go version to 1.26.5 by @Subserial in google/go-containerregistry#2388

## New Contributors
* @xuxiaowei-com-cn made their first contribution in google/go-containerregistry#2358
* @knQzx made their first contribution in google/go-containerregistry#2373
* @arpitjain099 made their first contribution in google/go-containerregistry#2370
* @vigneshakaviki made their first contribution in google/go-containerregistry#2379
* @amitzig made their first contribution in google/go-containerregistry#2360
* @x64vps made their first contribution in google/go-containerregistry#2356
* @kevinmdavis made their first contribution in google/go-containerregistry#2366
* @sadmanf made their first contribution in google/go-containerregistry#2372

**Full Changelog**: https://github.com/google/go-containerregistry/compare/v0.21.7...v0.21.8</pre>
  <p>View the full release notes at <a href="https://github.com/google/go-containerregistry/releases/tag/v0.21.8">https://github.com/google/go-containerregistry/releases/tag/v0.21.8</a>.</p>
</details>
<hr>

See merge request: Harmonybrew/homebrew-core!15552
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.

remote: pullLimiter deadlocks callers that read Compressed() to EOF without calling Close()

3 participants