diff --git a/internal/dns/loop.go b/internal/dns/loop.go index ef1d6546..531d30b0 100644 --- a/internal/dns/loop.go +++ b/internal/dns/loop.go @@ -159,6 +159,11 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { stayHere = false case err := <-waitError: // unexpected error unboundCancel() + if ctx.Err() != nil { + close(waitError) + closeStreams() + return + } l.state.setStatusWithLock(constants.Crashed) const fallback = true l.useUnencryptedDNS(fallback) diff --git a/internal/openvpn/loop.go b/internal/openvpn/loop.go index 20d30384..77cbeea5 100644 --- a/internal/openvpn/loop.go +++ b/internal/openvpn/loop.go @@ -211,6 +211,14 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { //nolint:gocog stayHere = false case err := <-waitError: // unexpected error openvpnCancel() + if ctx.Err() != nil { + close(waitError) + close(stdoutLines) + close(stderrLines) + <-lineCollectionDone + <-portForwardDone + return + } l.state.setStatusWithLock(constants.Crashed) l.logAndWait(ctx, err) l.crashed = true diff --git a/internal/shadowsocks/loop.go b/internal/shadowsocks/loop.go index cb0acb0b..246c7def 100644 --- a/internal/shadowsocks/loop.go +++ b/internal/shadowsocks/loop.go @@ -139,6 +139,9 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { case err := <-waitError: // unexpected error shadowsocksCancel() close(waitError) + if ctx.Err() != nil { + return + } l.state.setStatusWithLock(constants.Crashed) l.logAndWait(ctx, err) crashed = true