Skip to content

Commit 4046645

Browse files
committed
Fix data race
1 parent b7e2f9b commit 4046645

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

tunnel.go

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,24 @@ import (
66
)
77

88
func Tunnel(ctx context.Context, c1, c2 io.ReadWriteCloser, buf1, buf2 []byte) error {
9-
ctx, cancel := context.WithCancel(ctx)
10-
var errs tunnelErr
9+
errCh := make(chan error, 2)
1110
go func() {
12-
_, errs[0] = io.CopyBuffer(c1, c2, buf1)
13-
cancel()
11+
_, err := io.CopyBuffer(c1, c2, buf1)
12+
errCh <- err
1413
}()
1514
go func() {
16-
_, errs[1] = io.CopyBuffer(c2, c1, buf2)
17-
cancel()
15+
_, err := io.CopyBuffer(c2, c1, buf2)
16+
errCh <- err
17+
}()
18+
defer func() {
19+
_ = c1.Close()
20+
_ = c2.Close()
1821
}()
19-
<-ctx.Done()
20-
errs[2] = c1.Close()
21-
errs[3] = c2.Close()
22-
errs[4] = ctx.Err()
23-
if errs[4] == context.Canceled {
24-
errs[4] = nil
25-
}
26-
return errs.FirstError()
27-
}
28-
29-
type tunnelErr [5]error
3022

31-
func (t tunnelErr) FirstError() error {
32-
for _, err := range t {
33-
if err != nil {
34-
return err
35-
}
23+
select {
24+
case err := <-errCh:
25+
return err
26+
case <-ctx.Done():
27+
return ctx.Err()
3628
}
37-
return nil
3829
}

0 commit comments

Comments
 (0)