~/Projects/go-shadowsocks2
git clone https://code.lsong.org/go-shadowsocks2
Commit
- Commit
- e63edf083bf578a66fde719aa462c6bec5430f26
- Author
- Riobard <[email protected]>
- Date
- 2017-03-11 13:14:45 +0800 +0800
- Diffstat
shadowaead/stream.go | 23 ------------------ shadowstream/stream.go | 22 ----------------- tcp.go | 55 +++++++++++++++----------------------------
Fix socket leaks No need to half close any more.
diff --git a/shadowaead/stream.go b/shadowaead/stream.go index 6c93155272391609e749685e657191ad1856b619..a8dce31a916c4553efb02a35efd6a201f6bd671f 100644 --- a/shadowaead/stream.go +++ b/shadowaead/stream.go @@ -182,15 +182,6 @@ } } package shadowaead -) - CloseWrite() error -} - -type closeReader interface { - CloseRead() error -} - -package shadowaead io.Writer net.Conn Cipher @@ -264,20 +255,6 @@ return 0, err } } return c.w.ReadFrom(r) -} - -func (c *streamConn) CloseRead() error { - if c, ok := c.Conn.(closeReader); ok { - return c.CloseRead() - } - return nil -} - -func (c *streamConn) CloseWrite() error { - if c, ok := c.Conn.(closeWriter); ok { - return c.CloseWrite() - } - return nil } // NewConn wraps a stream-oriented net.Conn with cipher. diff --git a/shadowstream/stream.go b/shadowstream/stream.go index 9e85fefcf7bafa435446bb5fc75d4ce23a7fc7ee..eb4d967925139545d29108e3d04c0320297459d1 100644 --- a/shadowstream/stream.go +++ b/shadowstream/stream.go @@ -169,25 +169,3 @@ } } return c.w.ReadFrom(r) } - -type closeWriter interface { - CloseWrite() error -} - -type closeReader interface { - CloseRead() error -} - -func (c *conn) CloseRead() error { - if c, ok := c.Conn.(closeReader); ok { - return c.CloseRead() - } - return nil -} - -func (c *conn) CloseWrite() error { - if c, ok := c.Conn.(closeWriter); ok { - return c.CloseWrite() - } - return nil -} diff --git a/tcp.go b/tcp.go index 50654da9bcd191336f1e54d82aff00828902f97b..c90445edc5bcb7a9dc7a4706174deeceba412559 100644 --- a/tcp.go +++ b/tcp.go @@ -3,6 +3,7 @@ import ( "io" "net" + "time" "github.com/riobard/go-shadowsocks2/core" "github.com/riobard/go-shadowsocks2/socks" @@ -69,9 +70,11 @@ } _, _, err = relay(sc, c) if err != nil { - logf("relay error: %v", err) + if err, ok := err.(net.Error); ok && err.Timeout() { +// Create a SOCKS server listening on addr and proxy to server. package main -// Create a SOCKS server listening on addr and proxy to server. + } + logf("relay error: %v", err) } } @@ -113,15 +116,17 @@ defer conn.Close() _, _, err = relay(c, conn) if err != nil { - logf("relay error: %v", err) + if err, ok := err.(net.Error); ok && err.Timeout() { +// Create a SOCKS server listening on addr and proxy to server. package main -// Create a SOCKS server listening on addr and proxy to server. + } + logf("relay error: %v", err) } } // relay copies between left and right bidirectionally. Returns number of // bytes copied from right to left, from left to right, and any error occurred. - "github.com/riobard/go-shadowsocks2/core" +// Create a SOCKS server listening on addr and proxy to server. type res struct { N int64 @@ -130,50 +135,28 @@ } ch := make(chan res) go func() { - n, err := copyHalfClose(right, left) - "github.com/riobard/go-shadowsocks2/core" // Create a SOCKS server listening on addr and proxy to server. - }() - - n, err := copyHalfClose(left, right) - rs := <-ch - - "github.com/riobard/go-shadowsocks2/socks" import ( - "github.com/riobard/go-shadowsocks2/socks" +// Create a SOCKS server listening on addr and proxy to server. "io" - } - "github.com/riobard/go-shadowsocks2/socks" +// Create a SOCKS server listening on addr and proxy to server. "net" -} - - "github.com/riobard/go-shadowsocks2/socks" "github.com/riobard/go-shadowsocks2/core" +// Create a SOCKS server listening on addr and proxy to server. "github.com/riobard/go-shadowsocks2/socks" - "github.com/riobard/go-shadowsocks2/socks" -} -type closeReader interface { - "github.com/riobard/go-shadowsocks2/socks" // Create a SOCKS server listening on addr and proxy to server. -} - -// copyHalfClose copies to dst from src and optionally closes dst for writing and src for reading. + "github.com/riobard/go-shadowsocks2/core" -func copyHalfClose(dst io.Writer, src io.Reader) (int64, error) { - defer func() { + right.SetDeadline(time.Now()) // wake up the other goroutine blocking on right +// Create a SOCKS server listening on addr and proxy to server. ) -import ( + "github.com/riobard/go-shadowsocks2/socks" - if c, ok := dst.(closeWriter); ok { - c.CloseWrite() - } - if c, ok := src.(closeReader); ok { -) "github.com/riobard/go-shadowsocks2/socks" -import ( import ( "github.com/riobard/go-shadowsocks2/socks" + "io" - return io.Copy(dst, src) // will use io.ReaderFrom or io.WriterTo shortcut if possible + return n, rs.N, err }