diff --git a/cmd/gost/vendor/github.com/ginuerzh/gost/ss.go b/cmd/gost/vendor/github.com/ginuerzh/gost/ss.go index 81d48af..3959ad2 100644 --- a/cmd/gost/vendor/github.com/ginuerzh/gost/ss.go +++ b/cmd/gost/vendor/github.com/ginuerzh/gost/ss.go @@ -283,7 +283,7 @@ func (s *ShadowUdpServer) ListenAndServe() error { } select { - case ch <- &packet{srcAddr: addr.String(), dstAddr: dgram.Header.Addr.String(), data: b[:n+3]}: + case ch <- &packet{srcAddr: addr.String(), dstAddr: dgram.Header.Addr.String(), data: dgram.Data}: case <-time.After(time.Second * 3): glog.V(LWARNING).Infof("[ssu] %s -> %s : %s", addr, dgram.Header.Addr.String(), "send queue is full, discard") } @@ -292,12 +292,26 @@ func (s *ShadowUdpServer) ListenAndServe() error { // start recv queue go func(ch <-chan *packet) { for pkt := range ch { + srcAddr, err := net.ResolveUDPAddr("udp", pkt.srcAddr) + if err != nil { + glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) + continue + } dstAddr, err := net.ResolveUDPAddr("udp", pkt.dstAddr) if err != nil { glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) continue } - if _, err := conn.WriteTo(pkt.data, dstAddr); err != nil { + + dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, ToSocksAddr(srcAddr)), pkt.data) + b := bytes.Buffer{} + dgram.Write(&b) + if b.Len() < 10 { + glog.V(LWARNING).Infof("[ssu] %s <- %s : invalid udp datagram", pkt.dstAddr, pkt.srcAddr) + continue + } + + if _, err := conn.WriteTo(b.Bytes()[3:], dstAddr); err != nil { // remove rsv and frag fields to make it standard shadowsocks UDP datagram glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) return } diff --git a/cmd/gost/vendor/vendor.json b/cmd/gost/vendor/vendor.json index 25bb639..58ba5da 100644 --- a/cmd/gost/vendor/vendor.json +++ b/cmd/gost/vendor/vendor.json @@ -21,10 +21,10 @@ "revisionTime": "2017-01-19T05:34:58Z" }, { - "checksumSHA1": "idpL1fpHpfntk74IVfWtkP1PMZs=", + "checksumSHA1": "2kMuCJwcxppxWtk9dX1WtWZMGB4=", "path": "github.com/ginuerzh/gost", - "revision": "321b03712af504981d35a47c50c2cfe4dd788a9d", - "revisionTime": "2017-01-21T03:16:33Z" + "revision": "8861ffba01779f3a9f44b205b38d626fce71dff3", + "revisionTime": "2017-01-24T13:01:52Z" }, { "checksumSHA1": "URsJa4y/sUUw/STmbeYx9EKqaYE=", diff --git a/ss.go b/ss.go index 81d48af..3959ad2 100644 --- a/ss.go +++ b/ss.go @@ -283,7 +283,7 @@ func (s *ShadowUdpServer) ListenAndServe() error { } select { - case ch <- &packet{srcAddr: addr.String(), dstAddr: dgram.Header.Addr.String(), data: b[:n+3]}: + case ch <- &packet{srcAddr: addr.String(), dstAddr: dgram.Header.Addr.String(), data: dgram.Data}: case <-time.After(time.Second * 3): glog.V(LWARNING).Infof("[ssu] %s -> %s : %s", addr, dgram.Header.Addr.String(), "send queue is full, discard") } @@ -292,12 +292,26 @@ func (s *ShadowUdpServer) ListenAndServe() error { // start recv queue go func(ch <-chan *packet) { for pkt := range ch { + srcAddr, err := net.ResolveUDPAddr("udp", pkt.srcAddr) + if err != nil { + glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) + continue + } dstAddr, err := net.ResolveUDPAddr("udp", pkt.dstAddr) if err != nil { glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) continue } - if _, err := conn.WriteTo(pkt.data, dstAddr); err != nil { + + dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, ToSocksAddr(srcAddr)), pkt.data) + b := bytes.Buffer{} + dgram.Write(&b) + if b.Len() < 10 { + glog.V(LWARNING).Infof("[ssu] %s <- %s : invalid udp datagram", pkt.dstAddr, pkt.srcAddr) + continue + } + + if _, err := conn.WriteTo(b.Bytes()[3:], dstAddr); err != nil { // remove rsv and frag fields to make it standard shadowsocks UDP datagram glog.V(LWARNING).Infof("[ssu] %s <- %s : %s", pkt.dstAddr, pkt.srcAddr, err) return }