diff --git a/go.mod b/go.mod index d1a86a6..4214425 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/dgryski/go-idea v0.0.0-20170306091226-d2fb45a411fb github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152 github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 // indirect - github.com/insomniacslk/dhcp v0.0.0-20210420214155-58efeba27ae8 + github.com/insomniacslk/dhcp v0.0.0-20210428091707-95b2ff6905c9 github.com/klauspost/cpuid/v2 v2.0.6 // indirect github.com/klauspost/reedsolomon v1.9.12 // indirect github.com/mdlayher/raw v0.0.0-20210412142147-51b895745faf // indirect @@ -17,7 +17,7 @@ require ( github.com/tjfoc/gmsm v1.4.0 // indirect github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b - golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 // indirect + golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 // indirect ) diff --git a/go.sum b/go.sum index decc2ed..8b90b8c 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8= github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis= -github.com/insomniacslk/dhcp v0.0.0-20210420214155-58efeba27ae8 h1:RV5UbIISMfxSMcKwCZKrxVEhHcSfemkxpxcRXAmR0AM= -github.com/insomniacslk/dhcp v0.0.0-20210420214155-58efeba27ae8/go.mod h1:TKl4jN3Voofo4UJIicyNhWGp/nlQqQkFxmwIFTvBkKI= +github.com/insomniacslk/dhcp v0.0.0-20210428091707-95b2ff6905c9 h1:T+Czi1NGxrbx8enhcdUFPVYTpGd6DPDxrKptDXRgD8I= +github.com/insomniacslk/dhcp v0.0.0-20210428091707-95b2ff6905c9/go.mod h1:TKl4jN3Voofo4UJIicyNhWGp/nlQqQkFxmwIFTvBkKI= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= @@ -128,8 +128,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 h1:0PC75Fz/kyMGhL0e1QnypqK2kQMqKt9csD1GnMJR+Zk= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/proxy/protocol/smux/session.go b/proxy/protocol/smux/session.go index f8cfee7..3efec4d 100644 --- a/proxy/protocol/smux/session.go +++ b/proxy/protocol/smux/session.go @@ -4,8 +4,10 @@ import ( "container/heap" "encoding/binary" "errors" + "fmt" "io" "net" + "os" "sync" "sync/atomic" "time" @@ -21,8 +23,9 @@ var ( ErrInvalidProtocol = errors.New("invalid protocol") ErrConsumed = errors.New("peer consumed more than sent") ErrGoAway = errors.New("stream id overflows, should start a new connection") - ErrTimeout = errors.New("timeout") - ErrWouldBlock = errors.New("operation would block on IO") + // ErrTimeout = errors.New("timeout") + ErrTimeout = fmt.Errorf("smux: %w", os.ErrDeadlineExceeded) + ErrWouldBlock = errors.New("operation would block on IO") ) type writeRequest struct { diff --git a/proxy/smux/client.go b/proxy/smux/client.go index a586364..21d9114 100644 --- a/proxy/smux/client.go +++ b/proxy/smux/client.go @@ -4,6 +4,7 @@ import ( "errors" "net" "net/url" + "sync" "github.com/nadoo/glider/log" "github.com/nadoo/glider/proxy" @@ -15,6 +16,7 @@ import ( type SmuxClient struct { dialer proxy.Dialer addr string + mu sync.Mutex session *smux.Session } @@ -66,6 +68,9 @@ func (s *SmuxClient) DialUDP(network, addr string) (net.PacketConn, net.Addr, er } func (s *SmuxClient) initConn() error { + s.mu.Lock() + defer s.mu.Unlock() + conn, err := s.dialer.Dial("tcp", s.addr) if err != nil { log.F("[smux] dial to %s error: %s", s.addr, err)