Liu Song’s Projects


~/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
 }