Skip to content

cmd/go: deadlock when using GODEBUG=cmdgonetlimit due to net semaphore token leak #77777

Description

@d-enk

Go version:

go version go1.27-devel_a3688ab1 Tue Feb 3 20:24:21 2026 -0800 linux/amd64

Description:

$ GODEBUG=cmdgonetlimit=1 gotip mod vendor
fatal error: all goroutines are asleep - deadlock!
Stack trace
goroutine 1 [chan receive, 1 minutes]:
cmd/go/internal/modload.loadFromRoots(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {{{0x0, 0x0}, 0x2eb1a483b740, 0x0, 0x0, {0x0, 0x0}, ...}, ...})
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1169 +0x590
cmd/go/internal/modload.LoadPackages(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {{0x0, 0x0}, 0x2eb1a483b740, 0x0, 0x0, {0x0, 0x0}, ...}, ...)
	/sdk/gotip/src/cmd/go/internal/modload/load.go:372 +0x57c
cmd/go/internal/modcmd.RunVendor(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, 0x0, {0x0, 0x0}, {0x2eb1a47a4260?, 0x486825?, 0x16?})
	/sdk/gotip/src/cmd/go/internal/modcmd/vendor.go:92 +0x19e
cmd/go/internal/modcmd.runVendor({0xafa7f8, 0x11932a0}, 0x2eb1a47ea8e8?, {0x2eb1a47a4260, 0x0, 0x0})
	/sdk/gotip/src/cmd/go/internal/modcmd/vendor.go:74 +0x14b
main.invoke(0x1162b00, {0x2eb1a47a4260, 0x1, 0x1})
	/sdk/gotip/src/cmd/go/main.go:340 +0x8b9
main.main()
	/sdk/gotip/src/cmd/go/main.go:219 +0xeb6

goroutine 9 [chan send]:
cmd/go/internal/base.AcquireNet()
	/sdk/gotip/src/cmd/go/internal/base/limit.go:50 +0x138
cmd/go/internal/web.get.func1(0x2eb1a4978450)
	/sdk/gotip/src/cmd/go/internal/web/http.go:150 +0x357
cmd/go/internal/web.get(0x0, 0x2eb1a4a10360)
	/sdk/gotip/src/cmd/go/internal/web/http.go:206 +0x4e3
cmd/go/internal/web.Get(...)
	/sdk/gotip/src/cmd/go/internal/web/api.go:186
cmd/go/internal/vcs.metaImportsForPrefix.func2()
	/sdk/gotip/src/cmd/go/internal/vcs/vcs.go:1241 +0x1f0
internal/singleflight.(*Group).doCall(0x116e940, 0x2eb1a47f69b0, {0x2eb1a49fea20, 0x27}, 0x0?)
	/sdk/gotip/src/internal/singleflight/singleflight.go:93 +0x34
internal/singleflight.(*Group).Do(0x116e940, {0x2eb1a49fea20, 0x27}, 0x2eb1a4978910)
	/sdk/gotip/src/internal/singleflight/singleflight.go:63 +0x1a9
cmd/go/internal/vcs.metaImportsForPrefix({0x2eb1a49fea20?, 0x0?}, 0x2eb1a4ba5280?, 0x1?)
	/sdk/gotip/src/cmd/go/internal/vcs/vcs.go:1229 +0x8e
cmd/go/internal/vcs.repoRootForImportDynamic({0x2eb1a48c69a1, 0x2a}, 0x1, 0x0)
	/sdk/gotip/src/cmd/go/internal/vcs/vcs.go:1130 +0x88a
cmd/go/internal/vcs.RepoRootForImportPath({0x2eb1a48c69a1, 0x2a}, 0x1, 0x0)
	/sdk/gotip/src/cmd/go/internal/vcs/vcs.go:879 +0xce
cmd/go/internal/modfetch.lookupDirect({0xafa7f8, 0x11932a0}, {0x2eb1a48c69a1, 0x2a})
	/sdk/gotip/src/cmd/go/internal/modfetch/repo.go:305 +0x65
cmd/go/internal/modfetch.lookup(0x10e4100?, {0xafa7f8, 0x11932a0}, {0xa8d0c6, 0x7}, {0x2eb1a48c69a1, 0x2a})
	/sdk/gotip/src/cmd/go/internal/modfetch/repo.go:264 +0x1f9
cmd/go/internal/modfetch.(*Fetcher).Lookup.func1.1({0xafa7f8?, 0x11932a0?})
	/sdk/gotip/src/cmd/go/internal/modfetch/repo.go:210 +0x3a
cmd/go/internal/modfetch.(*cachingRepo).repo.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:211 +0x2f
sync.(*Once).doSlow(0x2eb1a483b590?, 0xb02de0?)
	/sdk/gotip/src/sync/once.go:78 +0xac
sync.(*Once).Do(...)
	/sdk/gotip/src/sync/once.go:69
cmd/go/internal/modfetch.(*cachingRepo).repo(0x2eb1a4bb2100, {0xafa7f8?, 0x11932a0?})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:209 +0x54
cmd/go/internal/modfetch.(*cachingRepo).Zip(0x2eb1a479b490?, {0xafa7f8, 0x11932a0}, {0xaf3560, 0x2eb1a49880c0}, {0x2eb1a47aed30, 0x6})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:340 +0x95
cmd/go/internal/modfetch.(*Fetcher).downloadZip.func2({0xa8d0c6?, 0xaf3580?})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:309 +0xa2
cmd/go/internal/modfetch.TryProxies(0x2eb1a4979280)
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:163 +0xaf
cmd/go/internal/modfetch.(*Fetcher).downloadZip(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a48c69a1?, 0x2eb1a47aed30?}, {0x2eb1a47aed30?, 0x2?}}, {0x2eb1a4a38f60, 0x5d})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:304 +0x44a
cmd/go/internal/modfetch.(*Fetcher).DownloadZip.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:241 +0x43a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a48c69a1, 0x2a}, {0x2eb1a47aed30, 0x6}}, 0x2eb1a4985588)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x1152060?, {{0x2eb1a48c69a1?, 0x2eb1a48c69a1?}, {0x2eb1a47aed30?, 0x15?}}, 0x1102708?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).DownloadZip(0xaf36e0?, {0xafa7f8?, 0x11932a0?}, {{0x2eb1a48c69a1?, 0x2eb1a47aed30?}, {0x2eb1a47aed30?, 0x485cb8?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:203 +0x85
cmd/go/internal/modfetch.(*Fetcher).download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a48c69a1?, 0x10b2d40?}, {0x2eb1a47aed30?, 0x10b2d40?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:112 +0x1ca
cmd/go/internal/modfetch.(*Fetcher).Download.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:53 +0x6a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a48c69a1, 0x2a}, {0x2eb1a47aed30, 0x6}}, 0x2eb1a49858b8)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x2a?, {{0x2eb1a48c69a1?, 0x6?}, {0x2eb1a47aed30?, 0x2f?}}, 0x0?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).Download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a48c69a1?, 0x6?}, {0x2eb1a47aed30?, 0x1?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:52 +0x13e
cmd/go/internal/modload.fetch(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {{0x2eb1a48c69a1?, 0x72a759495e5b?}, {0x2eb1a47aed30?, 0x1?}})
	/sdk/gotip/src/cmd/go/internal/modload/import.go:824 +0x407
cmd/go/internal/modload.importFromModules(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {0x2eb1a48c69a1, 0x2a}, 0x2eb1a47f6230, 0x0, 0x0)
	/sdk/gotip/src/cmd/go/internal/modload/import.go:420 +0xb7a
cmd/go/internal/modload.(*loader).load(0x2eb1a4886000, 0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, 0x2eb1a4868f70)
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1859 +0xb5
cmd/go/internal/modload.(*loader).pkg.func1.1()
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1673 +0x27
cmd/internal/par.(*Queue).Add.func1()
	/sdk/gotip/src/cmd/internal/par/queue.go:58 +0x57
created by cmd/internal/par.(*Queue).Add in goroutine 1
	/sdk/gotip/src/cmd/internal/par/queue.go:56 +0x1cd

goroutine 10 [chan send]:
cmd/go/internal/base.AcquireNet()
	/sdk/gotip/src/cmd/go/internal/base/limit.go:50 +0x138
cmd/go/internal/web.get.func1(0x2eb1a4772db0)
	/sdk/gotip/src/cmd/go/internal/web/http.go:150 +0x357
cmd/go/internal/web.get(0x1, 0x2eb1a4772e78)
	/sdk/gotip/src/cmd/go/internal/web/http.go:206 +0x4e3
cmd/go/internal/web.Get(...)
	/sdk/gotip/src/cmd/go/internal/web/api.go:186
cmd/go/internal/modfetch.(*proxyRepo).getBody(0x2eb1a4a66690, {0x21?, 0xe?}, {0x2eb1a4773040, 0xe})
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:281 +0x17c
cmd/go/internal/modfetch.(*proxyRepo).getBytes(0x2eb1a47aeda0?, {0xafa910?, 0x11932a0?}, {0x2eb1a4773040?, 0x4860d9?})
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:259 +0x5b
cmd/go/internal/modfetch.(*proxyRepo).GoMod(0x2eb1a4a66690, {0xafa910, 0x11932a0}, {0x2eb1a47aeda0, 0x7})
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:411 +0x145
cmd/go/internal/modfetch.(*cachingRepo).GoMod.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:319 +0xb5
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x29
cmd/internal/par.(*Cache[...]).Do(0xb02fe0, {0x2eb1a47aeda0, 0x7}, 0x2eb1a47732a0)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x156
cmd/internal/par.(*ErrCache[...]).Do(0x2eb1a483b590?, {0x2eb1a47aeda0?, 0x2eb1a47de1a0?}, 0x18?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x47
cmd/go/internal/modfetch.(*cachingRepo).GoMod(0x41960d?, {0xafa910?, 0x11932a0?}, {0x2eb1a47aeda0, 0x7})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:312 +0xfa
cmd/go/internal/modfetch.(*Fetcher).GoMod.func2({0x2eb1a47de1a0?, 0x2eb1a47b4370?})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:412 +0x77
cmd/go/internal/modfetch.TryProxies(0x2eb1a47734c8)
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:163 +0xaf
cmd/go/internal/modfetch.(*Fetcher).GoMod(0x2eb1a47c0600, {0xafa910, 0x11932a0}, {0x2eb1a49562ce, 0xf}, {0x2eb1a47aeda0, 0x7})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:411 +0x248
cmd/go/internal/modload.rawGoModData(0x2eb1a47c05a0, {{0x2eb1a49562ce?, 0x1?}, {0x2eb1a47aeda0?, 0x72a7596d29e8?}})
	/sdk/gotip/src/cmd/go/internal/modload/modfile.go:813 +0x17e
cmd/go/internal/modload.rawGoModSummary.func1()
	/sdk/gotip/src/cmd/go/internal/modload/modfile.go:712 +0x47
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02e60, {{0x2eb1a49562ce, 0xf}, {0x2eb1a47aeda0, 0x7}}, 0x2eb1a4773840)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x13c
cmd/internal/par.(*ErrCache[...]).Do(0xe?, {{0x2eb1a49562ce?, 0x2f?}, {0x2eb1a47aeda0?, 0x2eb1a47c0638?}}, 0x2eb1a49562ce?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modload.rawGoModSummary(0x2eb1a47c05a0, {{0x2eb1a49562ce, 0xf}, {0x2eb1a47aeda0, 0x7}})
	/sdk/gotip/src/cmd/go/internal/modload/modfile.go:711 +0x426
cmd/go/internal/modload.goModSummary(0x2eb1a47c05a0, {{0x2eb1a49562ce?, 0x2eb1a49562ce?}, {0x2eb1a47aeda0?, 0x10707a0?}})
	/sdk/gotip/src/cmd/go/internal/modload/modfile.go:612 +0x3f6
cmd/go/internal/modload.importFromModules(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {0x2eb1a49562ce, 0xf}, 0x2eb1a47f6230, 0x0, 0x0)
	/sdk/gotip/src/cmd/go/internal/modload/import.go:484 +0x1a6e
cmd/go/internal/modload.(*loader).load(0x2eb1a4886000, 0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, 0x2eb1a483c5b0)
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1859 +0xb5
cmd/go/internal/modload.(*loader).pkg.func1.1()
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1673 +0x27
cmd/internal/par.(*Queue).Add.func1()
	/sdk/gotip/src/cmd/internal/par/queue.go:58 +0x57
created by cmd/internal/par.(*Queue).Add in goroutine 1
	/sdk/gotip/src/cmd/internal/par/queue.go:56 +0x1cd

goroutine 11 [chan send]:
cmd/go/internal/base.AcquireNet()
	/sdk/gotip/src/cmd/go/internal/base/limit.go:50 +0x138
cmd/go/internal/modfetch/codehost.(*gitRepo).stat(0x2eb1a481ea20, {0xafa7f8, 0x11932a0}, {0x2eb1a47aece6, 0x6})
	/sdk/gotip/src/cmd/go/internal/modfetch/codehost/git.go:574 +0x75d
cmd/go/internal/modfetch/codehost.(*gitRepo).Stat.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/codehost/git.go:726 +0x27
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb036e0, {0x2eb1a47aece6, 0x6}, 0x2eb1a4a446c0)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x111
cmd/internal/par.(*ErrCache[...]).Do(0x2eb1a4992030?, {0x2eb1a47aece6?, 0x6?}, 0x2eb1a4a44798?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x38
cmd/go/internal/modfetch/codehost.(*gitRepo).Stat(0x1?, {0xafa7f8?, 0x11932a0?}, {0x2eb1a47aece6?, 0x0?})
	/sdk/gotip/src/cmd/go/internal/modfetch/codehost/git.go:725 +0x87
cmd/go/internal/modfetch/codehost.(*gitRepo).ReadFile(0x2eb1a481ea20, {0xafa7f8, 0x11932a0}, {0x2eb1a47aece6?, 0x2eb1a4cf2a10?}, {0x2eb1a4992030, 0x6}, 0xb022d0?)
	/sdk/gotip/src/cmd/go/internal/modfetch/codehost/git.go:732 +0x3b
cmd/go/internal/modfetch.(*codeRepo).findDir(0x2eb1a47f00e0, {0xafa7f8, 0x11932a0}, {0x2eb1a47aece6, 0x6})
	/sdk/gotip/src/cmd/go/internal/modfetch/coderepo.go:843 +0x11d
cmd/go/internal/modfetch.(*codeRepo).Zip(0x2eb1a47f00e0, {0xafa7f8, 0x11932a0}, {0xaf3560, 0x2eb1a4924068}, {0x2eb1a47aece6, 0x6})
	/sdk/gotip/src/cmd/go/internal/modfetch/coderepo.go:1087 +0x1be
cmd/go/internal/modfetch.(*cachingRepo).Zip(0x2eb1a48147e0?, {0xafa7f8, 0x11932a0}, {0xaf3560, 0x2eb1a4924068}, {0x2eb1a47aece6, 0x6})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:340 +0xbc
cmd/go/internal/modfetch.(*Fetcher).downloadZip.func2({0xa8d0c6?, 0xaf3580?})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:309 +0xa2
cmd/go/internal/modfetch.TryProxies(0x2eb1a4a45280)
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:163 +0xaf
cmd/go/internal/modfetch.(*Fetcher).downloadZip(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a46f167b?, 0x2eb1a47aece6?}, {0x2eb1a47aece6?, 0x2?}}, {0x2eb1a4998af0, 0x4f})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:304 +0x44a
cmd/go/internal/modfetch.(*Fetcher).DownloadZip.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:241 +0x43a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a46f167b, 0x1c}, {0x2eb1a47aece6, 0x6}}, 0x2eb1a4a45588)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x1152060?, {{0x2eb1a46f167b?, 0x2eb1a46f167b?}, {0x2eb1a47aece6?, 0x15?}}, 0x1102708?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).DownloadZip(0xaf36e0?, {0xafa7f8?, 0x11932a0?}, {{0x2eb1a46f167b?, 0x2eb1a47aece6?}, {0x2eb1a47aece6?, 0x72a75952a1e0?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:203 +0x85
cmd/go/internal/modfetch.(*Fetcher).download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a46f167b?, 0x10b2d40?}, {0x2eb1a47aece6?, 0x4242b4?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:112 +0x1ca
cmd/go/internal/modfetch.(*Fetcher).Download.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:53 +0x6a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a46f167b, 0x1c}, {0x2eb1a47aece6, 0x6}}, 0x2eb1a4a458b8)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x1c?, {{0x2eb1a46f167b?, 0x6?}, {0x2eb1a47aece6?, 0x2f?}}, 0x0?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).Download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a46f167b?, 0x6?}, {0x2eb1a47aece6?, 0x14?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:52 +0x13e
cmd/go/internal/modload.fetch(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {{0x2eb1a46f167b?, 0x0?}, {0x2eb1a47aece6?, 0x0?}})
	/sdk/gotip/src/cmd/go/internal/modload/import.go:824 +0x407
cmd/go/internal/modload.importFromModules(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {0x2eb1a46f167b, 0x1c}, 0x2eb1a47f6230, 0x0, 0x0)
	/sdk/gotip/src/cmd/go/internal/modload/import.go:420 +0xb7a
cmd/go/internal/modload.(*loader).load(0x2eb1a4886000, 0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, 0x2eb1a4837380)
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1859 +0xb5
cmd/go/internal/modload.(*loader).pkg.func1.1()
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1673 +0x27
cmd/internal/par.(*Queue).Add.func1()
	/sdk/gotip/src/cmd/internal/par/queue.go:58 +0x57
created by cmd/internal/par.(*Queue).Add in goroutine 1
	/sdk/gotip/src/cmd/internal/par/queue.go:56 +0x1cd

goroutine 12 [chan send, 1 minutes]:
cmd/go/internal/base.AcquireNet()
	/sdk/gotip/src/cmd/go/internal/base/limit.go:50 +0x138
cmd/go/internal/web.get.func1(0x2eb1a4f3ad48)
	/sdk/gotip/src/cmd/go/internal/web/http.go:150 +0x357
cmd/go/internal/web.get(0x1, 0x2eb1a4f3ae10)
	/sdk/gotip/src/cmd/go/internal/web/http.go:206 +0x4e3
cmd/go/internal/web.Get(...)
	/sdk/gotip/src/cmd/go/internal/web/api.go:186
cmd/go/internal/modfetch.(*proxyRepo).getBody(0x2eb1a4a669b0, {0xa8b3e3?, 0x2eb1a4f3af60?}, {0x2eb1a4f3af18, 0xe})
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:281 +0x17c
cmd/go/internal/modfetch.(*proxyRepo).Zip(0x2eb1a4a669b0, {0xafa7f8, 0x11932a0}, {0xaf3560, 0x2eb1a46dc240}, {0x2eb1a47aed56, 0x7})
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:428 +0x17e
cmd/go/internal/modfetch.(*cachingRepo).Zip(0xaf3580?, {0xafa7f8, 0x11932a0}, {0xaf3560, 0x2eb1a46dc240}, {0x2eb1a47aed56, 0x7})
	/sdk/gotip/src/cmd/go/internal/modfetch/cache.go:340 +0xbc
cmd/go/internal/modfetch.(*Fetcher).downloadZip.func2({0x2eb1a47de1a0?, 0x2eb1a47b4370?})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:309 +0xa2
cmd/go/internal/modfetch.TryProxies(0x2eb1a4f3b280)
	/sdk/gotip/src/cmd/go/internal/modfetch/proxy.go:163 +0xaf
cmd/go/internal/modfetch.(*Fetcher).downloadZip(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a4a78bc9?, 0x2eb1a47aed56?}, {0x2eb1a47aed56?, 0x2?}}, {0x2eb1a49fe900, 0x51})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:304 +0x44a
cmd/go/internal/modfetch.(*Fetcher).DownloadZip.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:241 +0x43a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a4a78bc9, 0x1d}, {0x2eb1a47aed56, 0x7}}, 0x2eb1a4f3b588)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x1152060?, {{0x2eb1a4a78bc9?, 0x2eb1a4a78bc9?}, {0x2eb1a47aed56?, 0x15?}}, 0x1102708?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).DownloadZip(0xaf36e0?, {0xafa7f8?, 0x11932a0?}, {{0x2eb1a4a78bc9?, 0x2eb1a47aed56?}, {0x2eb1a47aed56?, 0x72a7596d3848?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:203 +0x85
cmd/go/internal/modfetch.(*Fetcher).download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a4a78bc9?, 0x10b2d40?}, {0x2eb1a47aed56?, 0x4242b4?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:112 +0x1ca
cmd/go/internal/modfetch.(*Fetcher).Download.func1()
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:53 +0x6a
cmd/internal/par.(*ErrCache[...]).Do.func1()
	/sdk/gotip/src/cmd/internal/par/work.go:119 +0x13
cmd/internal/par.(*Cache[...]).Do(0xb02d60, {{0x2eb1a4a78bc9, 0x1d}, {0x2eb1a47aed56, 0x7}}, 0x2eb1a4f3b8b8)
	/sdk/gotip/src/cmd/internal/par/work.go:160 +0x144
cmd/internal/par.(*ErrCache[...]).Do(0x1d?, {{0x2eb1a4a78bc9?, 0x7?}, {0x2eb1a47aed56?, 0x2f?}}, 0x0?)
	/sdk/gotip/src/cmd/internal/par/work.go:118 +0x45
cmd/go/internal/modfetch.(*Fetcher).Download(0x2eb1a47c0600, {0xafa7f8, 0x11932a0}, {{0x2eb1a4a78bc9?, 0x7?}, {0x2eb1a47aed56?, 0x3?}})
	/sdk/gotip/src/cmd/go/internal/modfetch/fetch.go:52 +0x13e
cmd/go/internal/modload.fetch(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {{0x2eb1a4a78bc9?, 0x0?}, {0x2eb1a47aed56?, 0x0?}})
	/sdk/gotip/src/cmd/go/internal/modload/import.go:824 +0x407
cmd/go/internal/modload.importFromModules(0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, {0x2eb1a4a78bc9, 0x1d}, 0x2eb1a47f6230, 0x0, 0x0)
	/sdk/gotip/src/cmd/go/internal/modload/import.go:420 +0xb7a
cmd/go/internal/modload.(*loader).load(0x2eb1a4886000, 0x2eb1a47c05a0, {0xafa7f8, 0x11932a0}, 0x2eb1a4868ea0)
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1859 +0xb5
cmd/go/internal/modload.(*loader).pkg.func1.1()
	/sdk/gotip/src/cmd/go/internal/modload/load.go:1673 +0x27
cmd/internal/par.(*Queue).Add.func1()
	/sdk/gotip/src/cmd/internal/par/queue.go:58 +0x57
created by cmd/internal/par.(*Queue).Add in goroutine 1
	/sdk/gotip/src/cmd/internal/par/queue.go:56 +0x1cd

When using GODEBUG=cmdgonetlimit=1 to limit concurrent network operations, go mod vendor (and other module commands) can deadlock. The issue occurs because the net semaphore token is not properly released in certain error paths in the web.get.fetch function.

Steps to reproduce:

  1. Set GODEBUG=cmdgonetlimit=1 (or any limit > 0)
  2. Run gotip mod vendor in a project that requires fetching multiple modules
  3. Observe the deadlock after ~1 minute

What happens:

The program hangs with a "fatal error: all goroutines are asleep - deadlock!" message. Multiple goroutines are stuck waiting to acquire net semaphore tokens via base.AcquireNet(), while the main goroutine waits for the load queue to finish processing.

Root cause:

In src/cmd/go/internal/web/http.go, the fetch function has a defer statement that is supposed to release the net semaphore token on error:

defer func() {
    if err != nil && release != nil {
        release()
    }
}()

However, this defer only releases the token when err != nil. The problem occurs when:

  1. The first HTTP request succeeds (err == nil after line 159)
  2. The response has a 4xx status code (e.g., 401 Unauthorized)
  3. The retry with credentials (lines 165-176) fails with an error

In this case, the defer does not release the token because err was nil after the successful first request. The token is only supposed to be released via hookCloser.Close() when the response body is closed, but when an error occurs before returning a response, the token leaks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugReportIssues describing a possible bug in the Go implementation.NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions