fix type assert

This commit is contained in:
ginuerzh 2020-02-28 19:28:33 +08:00
parent e203d7760e
commit ee8b5d572c
3 changed files with 31 additions and 2 deletions

View File

@ -271,16 +271,20 @@ func (c *relayConn) Read(b []byte) (n int, err error) {
resp := new(relay.Response) resp := new(relay.Response)
_, err = resp.ReadFrom(c.Conn) _, err = resp.ReadFrom(c.Conn)
if err != nil { if err != nil {
log.Log("[relay] read:", err)
return return
} }
if resp.Version != relay.Version1 { if resp.Version != relay.Version1 {
err = relay.ErrBadVersion err = relay.ErrBadVersion
log.Log("[relay] read:", err)
return return
} }
if resp.Status != relay.StatusOK { if resp.Status != relay.StatusOK {
err = fmt.Errorf("status %d", resp.Status) err = fmt.Errorf("status %d", resp.Status)
log.Log("[relay] read:", err)
return return
} }
log.Log("[relay] read response OK")
}) })
if !c.udp { if !c.udp {
@ -292,6 +296,7 @@ func (c *relayConn) Read(b []byte) (n int, err error) {
return return
} }
dlen := int(binary.BigEndian.Uint16(bb[:])) dlen := int(binary.BigEndian.Uint16(bb[:]))
log.Log("[relay] read udp", dlen)
if len(b) >= dlen { if len(b) >= dlen {
return io.ReadFull(c.Conn, b[:dlen]) return io.ReadFull(c.Conn, b[:dlen])
} }
@ -301,6 +306,12 @@ func (c *relayConn) Read(b []byte) (n int, err error) {
return return
} }
func (c *relayConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
n, err = c.Read(b)
addr = c.Conn.RemoteAddr()
return
}
func (c *relayConn) Write(b []byte) (n int, err error) { func (c *relayConn) Write(b []byte) (n int, err error) {
if len(b) > 0xFFFF { if len(b) > 0xFFFF {
err = errors.New("write: data maximum exceeded") err = errors.New("write: data maximum exceeded")
@ -314,6 +325,7 @@ func (c *relayConn) Write(b []byte) (n int, err error) {
c.wbuf.Write(bb[:]) c.wbuf.Write(bb[:])
} }
c.wbuf.Write(b) // append the data to the cached header c.wbuf.Write(b) // append the data to the cached header
log.Log("[relay] write wbuf", len(b))
// _, err = c.Conn.Write(c.wbuf.Bytes()) // _, err = c.Conn.Write(c.wbuf.Bytes())
// c.wbuf.Reset() // c.wbuf.Reset()
_, err = c.wbuf.WriteTo(c.Conn) _, err = c.wbuf.WriteTo(c.Conn)
@ -327,5 +339,10 @@ func (c *relayConn) Write(b []byte) (n int, err error) {
binary.BigEndian.PutUint16(buf[:2], uint16(len(b))) binary.BigEndian.PutUint16(buf[:2], uint16(len(b)))
n = copy(buf[2:], b) n = copy(buf[2:], b)
_, err = c.Conn.Write(buf) _, err = c.Conn.Write(buf)
log.Log("[relay] write", n)
return return
} }
func (c *relayConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
return c.Write(b)
}

8
ss.go
View File

@ -302,7 +302,13 @@ func (h *shadowUDPHandler) Handle(conn net.Conn) {
log.Logf("[ssu] %s: %s", conn.LocalAddr(), err) log.Logf("[ssu] %s: %s", conn.LocalAddr(), err)
return return
} }
cc = c.(net.PacketConn) var ok bool
cc, ok = c.(net.PacketConn)
if !ok {
log.Logf("[ssu] %s: not a packet connection", conn.LocalAddr())
return
}
defer cc.Close() defer cc.Close()
pc, ok := conn.(net.PacketConn) pc, ok := conn.(net.PacketConn)

View File

@ -173,7 +173,13 @@ func (h *tunHandler) Handle(conn net.Conn) {
if err != nil { if err != nil {
return err return err
} }
pc = cc.(net.PacketConn) var ok bool
pc, ok = cc.(net.PacketConn)
if !ok {
err = errors.New("not a packet connection")
log.Logf("[tun] %s - %s: %s", conn.LocalAddr(), raddr, err)
return err
}
} else { } else {
if h.options.TCPMode { if h.options.TCPMode {
if raddr != nil { if raddr != nil {