integration: close accepted connection on stopc path
Connection pausing added another exit condition in the listener
path, causing the bridge to leak connections instead of closing
them when signalled to close. Also adds some additional Close
paranoia.
Fixes
@@ -119,6 +119,7 @@ func (b *bridge) serveListen() {
b.mu.Unlock()
select {
case <-b.stopc:
+ inc.Close()
return
case <-pausec:
}
@@ -152,10 +153,12 @@ func (b *bridge) serveConn(bc *bridgeConn) {
wg.Add(2)
go func() {
io.Copy(bc.out, bc.in)
+ bc.close()
wg.Done()
}()
go func() {
io.Copy(bc.in, bc.out)
+ bc.close()
wg.Done()
}()
wg.Wait()
@@ -168,7 +171,11 @@ type bridgeConn struct {
}
func (bc *bridgeConn) Close() {
+ bc.close()
+ <-bc.donec
+}
+
+func (bc *bridgeConn) close() {
bc.in.Close()
bc.out.Close()
- <-bc.donec
}
