diff --git a/pkg/agent/tunnelserver/tunnelserver.go b/pkg/agent/tunnelserver/tunnelserver.go index 22a6bad66..39b24e9df 100644 --- a/pkg/agent/tunnelserver/tunnelserver.go +++ b/pkg/agent/tunnelserver/tunnelserver.go @@ -129,8 +129,18 @@ func (t *tunnelServer) RunWithResult( errChan <- s.Serve(lis) }() + stopCtx, stopCancel := context.WithCancel(ctx) + defer stopCancel() + go func() { + <-stopCtx.Done() + s.Stop() + }() + select { case err := <-errChan: + if t.result != nil { + return t.result, nil + } return nil, err case <-ctx.Done(): return t.result, nil diff --git a/pkg/tunnel/pipebridge.go b/pkg/tunnel/pipebridge.go index 4562d74a6..ce4e82ec7 100644 --- a/pkg/tunnel/pipebridge.go +++ b/pkg/tunnel/pipebridge.go @@ -62,10 +62,11 @@ func (pb *PipeBridge) RunPair( handlerChan <- handlerFn(cancelCtx, pb.StdoutReader, pb.StdinWriter) }() - return awaitPair(tunnelChan, handlerChan, pb.StdoutWriter, pb.StdinWriter) + return awaitPair(cancel, tunnelChan, handlerChan, pb.StdoutWriter, pb.StdinWriter) } func awaitPair( + cancel context.CancelFunc, tunnelChan, handlerChan <-chan error, stdoutWriter, stdinWriter *os.File, ) error { @@ -78,6 +79,7 @@ func awaitPair( default: } case tunnelErr = <-tunnelChan: + cancel() _ = stdoutWriter.Close() _ = stdinWriter.Close() handlerErr = <-handlerChan