From 05c6b9379ad74ffcb937eb577a16728c049c3266 Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (desktop)" Date: Thu, 10 Jun 2021 14:13:08 +0000 Subject: [PATCH] Maintenance: prevent exit race condition for loops --- internal/dns/loop.go | 5 +++++ internal/openvpn/loop.go | 8 ++++++++ internal/shadowsocks/loop.go | 3 +++ 3 files changed, 16 insertions(+) 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