net/tstun: do not write when Wrapper is closed (#19038)

Two methods could deadlock during shutdown when closing the wrapper.

Ensure that the writers are aware of the wrapper being closed.

Fixes #19037

Signed-off-by: Claus Lensbøl <claus@tailscale.com>
This commit is contained in:
Claus Lensbøl
2026-03-18 17:53:34 -04:00
committed by GitHub
parent 4e88d231d5
commit 2534bc3202

View File

@@ -512,8 +512,9 @@ func (t *Wrapper) injectOutbound(r tunInjectedRead) {
if t.outboundClosed {
return
}
t.vectorOutbound <- tunVectorReadResult{
injected: r,
select {
case t.vectorOutbound <- tunVectorReadResult{injected: r}:
case <-t.closed:
}
}
@@ -524,7 +525,10 @@ func (t *Wrapper) sendVectorOutbound(r tunVectorReadResult) {
if t.outboundClosed {
return
}
t.vectorOutbound <- r
select {
case t.vectorOutbound <- r:
case <-t.closed:
}
}
// snat does SNAT on p if the destination address requires a different source address.