change []byte bufpool to *[]byte

This commit is contained in:
ginuerzh
2022-01-06 09:50:37 +08:00
parent 3b48c4acfb
commit f45dc93e92
16 changed files with 98 additions and 86 deletions

View File

@ -11,7 +11,8 @@ var (
size: 128, size: 128,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 128) b := make([]byte, 128)
return &b
}, },
}, },
}, },
@ -19,7 +20,8 @@ var (
size: 512, size: 512,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 512) b := make([]byte, 512)
return &b
}, },
}, },
}, },
@ -27,7 +29,8 @@ var (
size: 1024, size: 1024,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 1024) b := make([]byte, 1024)
return &b
}, },
}, },
}, },
@ -35,7 +38,8 @@ var (
size: 4096, size: 4096,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 4096) b := make([]byte, 4096)
return &b
}, },
}, },
}, },
@ -43,7 +47,8 @@ var (
size: 8192, size: 8192,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 8192) b := make([]byte, 8192)
return &b
}, },
}, },
}, },
@ -51,7 +56,8 @@ var (
size: 16 * 1024, size: 16 * 1024,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 16*1024) b := make([]byte, 16*1024)
return &b
}, },
}, },
}, },
@ -59,7 +65,8 @@ var (
size: 32 * 1024, size: 32 * 1024,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 32*1024) b := make([]byte, 32*1024)
return &b
}, },
}, },
}, },
@ -67,7 +74,8 @@ var (
size: 64 * 1024, size: 64 * 1024,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 64*1024) b := make([]byte, 64*1024)
return &b
}, },
}, },
}, },
@ -75,27 +83,31 @@ var (
size: 65 * 1024, size: 65 * 1024,
pool: sync.Pool{ pool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 65*1024) b := make([]byte, 65*1024)
return &b
}, },
}, },
}, },
} }
) )
// Get returns a buffer size. // Get returns a buffer of specified size.
func Get(size int) []byte { func Get(size int) *[]byte {
for i := range pools { for i := range pools {
if size <= pools[i].size { if size <= pools[i].size {
return pools[i].pool.Get().([]byte)[:size] b := pools[i].pool.Get().(*[]byte)
*b = (*b)[:size]
return b
} }
} }
return make([]byte, size) b := make([]byte, size)
return &b
} }
func Put(b []byte) { func Put(b *[]byte) {
for i := range pools { for i := range pools {
if cap(b) == pools[i].size { if cap(*b) == pools[i].size {
pools[i].pool.Put(b[:cap(b)]) pools[i].pool.Put(b)
} }
} }
} }

View File

@ -110,7 +110,7 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
rbuf := bufpool.Get(c.bufferSize) rbuf := bufpool.Get(c.bufferSize)
defer bufpool.Put(rbuf) defer bufpool.Put(rbuf)
n, c.raddr, err = c.PacketConn.ReadFrom(rbuf) n, c.raddr, err = c.PacketConn.ReadFrom(*rbuf)
if err != nil { if err != nil {
return return
} }
@ -119,11 +119,11 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
header := gosocks5.UDPHeader{ header := gosocks5.UDPHeader{
Addr: &socksAddr, Addr: &socksAddr,
} }
hlen, err := header.ReadFrom(bytes.NewReader(rbuf[:n])) hlen, err := header.ReadFrom(bytes.NewReader((*rbuf)[:n]))
if err != nil { if err != nil {
return return
} }
n = copy(b, rbuf[hlen:n]) n = copy(b, (*rbuf)[hlen:n])
addr, err = net.ResolveUDPAddr("udp", socksAddr.String()) addr, err = net.ResolveUDPAddr("udp", socksAddr.String())
return return
@ -151,7 +151,7 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
Data: b, Data: b,
} }
buf := bytes.NewBuffer(wbuf[:0]) buf := bytes.NewBuffer((*wbuf)[:0])
_, err = dgram.WriteTo(buf) _, err = dgram.WriteTo(buf)
if err != nil { if err != nil {
return return

View File

@ -45,18 +45,18 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
rbuf := bufpool.Get(c.bufferSize) rbuf := bufpool.Get(c.bufferSize)
defer bufpool.Put(rbuf) defer bufpool.Put(rbuf)
n, _, err = c.PacketConn.ReadFrom(rbuf) n, _, err = c.PacketConn.ReadFrom(*rbuf)
if err != nil { if err != nil {
return return
} }
saddr := gosocks5.Addr{} saddr := gosocks5.Addr{}
addrLen, err := saddr.ReadFrom(bytes.NewReader(rbuf[:n])) addrLen, err := saddr.ReadFrom(bytes.NewReader((*rbuf)[:n]))
if err != nil { if err != nil {
return return
} }
n = copy(b, rbuf[addrLen:n]) n = copy(b, (*rbuf)[addrLen:n])
addr, err = net.ResolveUDPAddr("udp", saddr.String()) addr, err = net.ResolveUDPAddr("udp", saddr.String())
return return
@ -76,13 +76,13 @@ func (c *UDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
return return
} }
addrLen, err := socksAddr.Encode(wbuf) addrLen, err := socksAddr.Encode(*wbuf)
if err != nil { if err != nil {
return return
} }
n = copy(wbuf[addrLen:], b) n = copy((*wbuf)[addrLen:], b)
_, err = c.PacketConn.WriteTo(wbuf[:addrLen+n], c.raddr) _, err = c.PacketConn.WriteTo((*wbuf)[:addrLen+n], c.raddr)
return return
} }

View File

@ -35,7 +35,7 @@ func (c *Conn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
case bb := <-c.rc: case bb := <-c.rc:
n = copy(b, bb) n = copy(b, bb)
c.SetIdle(false) c.SetIdle(false)
bufpool.Put(bb) bufpool.Put(&bb)
case <-c.closed: case <-c.closed:
err = net.ErrClosed err = net.ErrClosed

View File

@ -56,7 +56,7 @@ func (ln *listener) listenLoop() {
b := bufpool.Get(ln.readBufferSize) b := bufpool.Get(ln.readBufferSize)
n, raddr, err := ln.conn.ReadFrom(b) n, raddr, err := ln.conn.ReadFrom(*b)
if err != nil { if err != nil {
return return
} }
@ -67,7 +67,7 @@ func (ln *listener) listenLoop() {
continue continue
} }
if err := c.WriteQueue(b[:n]); err != nil { if err := c.WriteQueue((*b)[:n]); err != nil {
ln.logger.Warn("data discarded: ", err) ln.logger.Warn("data discarded: ", err)
} }
} }

View File

@ -83,7 +83,7 @@ func (c *ssConnector) Connect(ctx context.Context, conn net.Conn, network, addre
rawaddr := bufpool.Get(512) rawaddr := bufpool.Get(512)
defer bufpool.Put(rawaddr) defer bufpool.Put(rawaddr)
n, err := addr.Encode(rawaddr) n, err := addr.Encode(*rawaddr)
if err != nil { if err != nil {
c.logger.Error("encoding addr: ", err) c.logger.Error("encoding addr: ", err)
return nil, err return nil, err
@ -102,12 +102,12 @@ func (c *ssConnector) Connect(ctx context.Context, conn net.Conn, network, addre
if c.md.noDelay { if c.md.noDelay {
sc = ss.ShadowConn(conn, nil) sc = ss.ShadowConn(conn, nil)
// write the addr at once. // write the addr at once.
if _, err := sc.Write(rawaddr[:n]); err != nil { if _, err := sc.Write((*rawaddr)[:n]); err != nil {
return nil, err return nil, err
} }
} else { } else {
// cache the header // cache the header
sc = ss.ShadowConn(conn, rawaddr[:n]) sc = ss.ShadowConn(conn, (*rawaddr)[:n])
} }
return sc, nil return sc, nil

View File

@ -116,14 +116,14 @@ func (h *dnsHandler) Handle(ctx context.Context, conn net.Conn) {
b := bufpool.Get(4096) b := bufpool.Get(4096)
defer bufpool.Put(b) defer bufpool.Put(b)
n, err := conn.Read(b) n, err := conn.Read(*b)
if err != nil { if err != nil {
h.logger.Error(err) h.logger.Error(err)
return return
} }
h.logger.Info("read data: ", n) h.logger.Info("read data: ", n)
reply, err := h.exchange(ctx, b[:n]) reply, err := h.exchange(ctx, (*b)[:n])
if err != nil { if err != nil {
return return
} }

View File

@ -52,7 +52,7 @@ func (r *UDPRelay) Run() (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, raddr, err := r.pc1.ReadFrom(b) n, raddr, err := r.pc1.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -64,7 +64,7 @@ func (r *UDPRelay) Run() (err error) {
return nil return nil
} }
if _, err := r.pc2.WriteTo(b[:n], raddr); err != nil { if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil {
return err return err
} }
@ -90,7 +90,7 @@ func (r *UDPRelay) Run() (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, raddr, err := r.pc2.ReadFrom(b) n, raddr, err := r.pc2.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -102,7 +102,7 @@ func (r *UDPRelay) Run() (err error) {
return nil return nil
} }
if _, err := r.pc1.WriteTo(b[:n], raddr); err != nil { if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil {
return err return err
} }

View File

@ -196,7 +196,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, raddr, err := tunnel.ReadFrom(b) n, raddr, err := tunnel.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -206,7 +206,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
return nil return nil
} }
if _, err := c.WriteTo(b[:n], raddr); err != nil { if _, err := c.WriteTo((*b)[:n], raddr); err != nil {
return err return err
} }
@ -229,7 +229,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, raddr, err := c.ReadFrom(b) n, raddr, err := c.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -239,7 +239,7 @@ func (h *relayHandler) tunnelServerUDP(tunnel, c net.PacketConn) (err error) {
return nil return nil
} }
if _, err := tunnel.WriteTo(b[:n], raddr); err != nil { if _, err := tunnel.WriteTo((*b)[:n], raddr); err != nil {
return err return err
} }
h.logger.Debugf("%s <<< %s data: %d", h.logger.Debugf("%s <<< %s data: %d",

View File

@ -120,13 +120,13 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn) {
buf := bufpool.Get(int(length) + dissector.RecordHeaderLen) buf := bufpool.Get(int(length) + dissector.RecordHeaderLen)
defer bufpool.Put(buf) defer bufpool.Put(buf)
if _, err := io.ReadFull(conn, buf[dissector.RecordHeaderLen:]); err != nil { if _, err := io.ReadFull(conn, (*buf)[dissector.RecordHeaderLen:]); err != nil {
h.logger.Error(err) h.logger.Error(err)
return return
} }
copy(buf, hdr[:]) copy(*buf, hdr[:])
buf, host, err := h.decodeHost(bytes.NewReader(buf)) opaque, host, err := h.decodeHost(bytes.NewReader(*buf))
if err != nil { if err != nil {
h.logger.Error(err) h.logger.Error(err)
return return
@ -149,7 +149,7 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn) {
} }
defer cc.Close() defer cc.Close()
if _, err := cc.Write(buf); err != nil { if _, err := cc.Write(opaque); err != nil {
h.logger.Error(err) h.logger.Error(err)
return return
} }

View File

@ -128,7 +128,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, addr, err := pc1.ReadFrom(b) n, addr, err := pc1.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -138,7 +138,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
return nil return nil
} }
if _, err = pc2.WriteTo(b[:n], addr); err != nil { if _, err = pc2.WriteTo((*b)[:n], addr); err != nil {
return err return err
} }
@ -160,7 +160,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
b := bufpool.Get(bufSize) b := bufpool.Get(bufSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, raddr, err := pc2.ReadFrom(b) n, raddr, err := pc2.ReadFrom(*b)
if err != nil { if err != nil {
return err return err
} }
@ -170,7 +170,7 @@ func (h *ssuHandler) relayPacket(pc1, pc2 net.PacketConn) (err error) {
return nil return nil
} }
if _, err = pc1.WriteTo(b[:n], raddr); err != nil { if _, err = pc1.WriteTo((*b)[:n], raddr); err != nil {
return err return err
} }

View File

@ -192,7 +192,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
b := bufpool.Get(h.md.bufferSize) b := bufpool.Get(h.md.bufferSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, err := tap.Read(b) n, err := tap.Read(*b)
if err != nil { if err != nil {
select { select {
case h.exit <- struct{}{}: case h.exit <- struct{}{}:
@ -201,22 +201,22 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
return err return err
} }
src := waterutil.MACSource(b[:n]) src := waterutil.MACSource((*b)[:n])
dst := waterutil.MACDestination(b[:n]) dst := waterutil.MACDestination((*b)[:n])
eType := etherType(waterutil.MACEthertype(b[:n])) eType := etherType(waterutil.MACEthertype((*b)[:n]))
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n) h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
// client side, deliver frame directly. // client side, deliver frame directly.
if raddr != nil { if raddr != nil {
_, err := conn.WriteTo(b[:n], raddr) _, err := conn.WriteTo((*b)[:n], raddr)
return err return err
} }
// server side, broadcast. // server side, broadcast.
if waterutil.IsBroadcast(dst) { if waterutil.IsBroadcast(dst) {
go h.routes.Range(func(k, v interface{}) bool { go h.routes.Range(func(k, v interface{}) bool {
conn.WriteTo(b[:n], v.(net.Addr)) conn.WriteTo((*b)[:n], v.(net.Addr))
return true return true
}) })
return nil return nil
@ -231,7 +231,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
return nil return nil
} }
if _, err := conn.WriteTo(b[:n], addr); err != nil { if _, err := conn.WriteTo((*b)[:n], addr); err != nil {
return err return err
} }
@ -251,21 +251,21 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
b := bufpool.Get(h.md.bufferSize) b := bufpool.Get(h.md.bufferSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, addr, err := conn.ReadFrom(b) n, addr, err := conn.ReadFrom(*b)
if err != nil && if err != nil &&
err != shadowaead.ErrShortPacket { err != shadowaead.ErrShortPacket {
return err return err
} }
src := waterutil.MACSource(b[:n]) src := waterutil.MACSource((*b)[:n])
dst := waterutil.MACDestination(b[:n]) dst := waterutil.MACDestination((*b)[:n])
eType := etherType(waterutil.MACEthertype(b[:n])) eType := etherType(waterutil.MACEthertype((*b)[:n]))
h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n) h.logger.Debugf("%s >> %s %s %d", src, dst, eType, n)
// client side, deliver frame to tap device. // client side, deliver frame to tap device.
if raddr != nil { if raddr != nil {
_, err := tap.Write(b[:n]) _, err := tap.Write((*b)[:n])
return err return err
} }
@ -284,7 +284,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
if waterutil.IsBroadcast(dst) { if waterutil.IsBroadcast(dst) {
go h.routes.Range(func(k, v interface{}) bool { go h.routes.Range(func(k, v interface{}) bool {
if k.(tapRouteKey) != rkey { if k.(tapRouteKey) != rkey {
conn.WriteTo(b[:n], v.(net.Addr)) conn.WriteTo((*b)[:n], v.(net.Addr))
} }
return true return true
}) })
@ -292,11 +292,11 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr
if v, ok := h.routes.Load(hwAddrToTapRouteKey(dst)); ok { if v, ok := h.routes.Load(hwAddrToTapRouteKey(dst)); ok {
h.logger.Debugf("find route: %s -> %s", dst, v) h.logger.Debugf("find route: %s -> %s", dst, v)
_, err := conn.WriteTo(b[:n], v.(net.Addr)) _, err := conn.WriteTo((*b)[:n], v.(net.Addr))
return err return err
} }
if _, err := tap.Write(b[:n]); err != nil { if _, err := tap.Write((*b)[:n]); err != nil {
select { select {
case h.exit <- struct{}{}: case h.exit <- struct{}{}:
default: default:

View File

@ -29,7 +29,7 @@ func copyBuffer(dst io.Writer, src io.Reader) error {
buf := bufpool.Get(16 * 1024) buf := bufpool.Get(16 * 1024)
defer bufpool.Put(buf) defer bufpool.Put(buf)
_, err := io.CopyBuffer(dst, src, buf) _, err := io.CopyBuffer(dst, src, *buf)
return err return err
} }

View File

@ -193,7 +193,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
b := bufpool.Get(h.md.bufferSize) b := bufpool.Get(h.md.bufferSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, err := tun.Read(b) n, err := tun.Read(*b)
if err != nil { if err != nil {
select { select {
case h.exit <- struct{}{}: case h.exit <- struct{}{}:
@ -203,19 +203,19 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
} }
var src, dst net.IP var src, dst net.IP
if waterutil.IsIPv4(b[:n]) { if waterutil.IsIPv4((*b)[:n]) {
header, err := ipv4.ParseHeader(b[:n]) header, err := ipv4.ParseHeader((*b)[:n])
if err != nil { if err != nil {
h.logger.Error(err) h.logger.Error(err)
return nil return nil
} }
h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d", h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d",
header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol(b[:n])), header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol((*b)[:n])),
header.Len, header.TotalLen, header.ID, header.Flags) header.Len, header.TotalLen, header.ID, header.Flags)
src, dst = header.Src, header.Dst src, dst = header.Src, header.Dst
} else if waterutil.IsIPv6(b[:n]) { } else if waterutil.IsIPv6((*b)[:n]) {
header, err := ipv6.ParseHeader(b[:n]) header, err := ipv6.ParseHeader((*b)[:n])
if err != nil { if err != nil {
h.logger.Warn(err) h.logger.Warn(err)
return nil return nil
@ -233,7 +233,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
// client side, deliver packet directly. // client side, deliver packet directly.
if raddr != nil { if raddr != nil {
_, err := conn.WriteTo(b[:n], raddr) _, err := conn.WriteTo((*b)[:n], raddr)
return err return err
} }
@ -245,7 +245,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
h.logger.Debugf("find route: %s -> %s", dst, addr) h.logger.Debugf("find route: %s -> %s", dst, addr)
if _, err := conn.WriteTo(b[:n], addr); err != nil { if _, err := conn.WriteTo((*b)[:n], addr); err != nil {
return err return err
} }
return nil return nil
@ -264,27 +264,27 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
b := bufpool.Get(h.md.bufferSize) b := bufpool.Get(h.md.bufferSize)
defer bufpool.Put(b) defer bufpool.Put(b)
n, addr, err := conn.ReadFrom(b) n, addr, err := conn.ReadFrom(*b)
if err != nil && if err != nil &&
err != shadowaead.ErrShortPacket { err != shadowaead.ErrShortPacket {
return err return err
} }
var src, dst net.IP var src, dst net.IP
if waterutil.IsIPv4(b[:n]) { if waterutil.IsIPv4((*b)[:n]) {
header, err := ipv4.ParseHeader(b[:n]) header, err := ipv4.ParseHeader((*b)[:n])
if err != nil { if err != nil {
h.logger.Warn(err) h.logger.Warn(err)
return nil return nil
} }
h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d", h.logger.Debugf("%s >> %s %-4s %d/%-4d %-4x %d",
header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol(b[:n])), header.Src, header.Dst, ipProtocol(waterutil.IPv4Protocol((*b)[:n])),
header.Len, header.TotalLen, header.ID, header.Flags) header.Len, header.TotalLen, header.ID, header.Flags)
src, dst = header.Src, header.Dst src, dst = header.Src, header.Dst
} else if waterutil.IsIPv6(b[:n]) { } else if waterutil.IsIPv6((*b)[:n]) {
header, err := ipv6.ParseHeader(b[:n]) header, err := ipv6.ParseHeader((*b)[:n])
if err != nil { if err != nil {
h.logger.Warn(err) h.logger.Warn(err)
return nil return nil
@ -303,7 +303,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
// client side, deliver packet to tun device. // client side, deliver packet to tun device.
if raddr != nil { if raddr != nil {
_, err := tun.Write(b[:n]) _, err := tun.Write((*b)[:n])
return err return err
} }
@ -321,11 +321,11 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr
if addr := h.findRouteFor(dst); addr != nil { if addr := h.findRouteFor(dst); addr != nil {
h.logger.Debugf("find route: %s -> %s", dst, addr) h.logger.Debugf("find route: %s -> %s", dst, addr)
_, err := conn.WriteTo(b[:n], addr) _, err := conn.WriteTo((*b)[:n], addr)
return err return err
} }
if _, err := tun.Write(b[:n]); err != nil { if _, err := tun.Write((*b)[:n]); err != nil {
select { select {
case h.exit <- struct{}{}: case h.exit <- struct{}{}:
default: default:

View File

@ -23,7 +23,7 @@ func (c *redirConn) Read(b []byte) (n int, err error) {
c.once.Do(func() { c.once.Do(func() {
n = copy(b, c.buf) n = copy(b, c.buf)
bufpool.Put(c.buf) bufpool.Put(&c.buf)
c.buf = nil c.buf = nil
}) })

View File

@ -14,7 +14,7 @@ func (l *redirectListener) listenUDP(addr *net.UDPAddr) (*net.UDPConn, error) {
func (l *redirectListener) accept() (conn net.Conn, err error) { func (l *redirectListener) accept() (conn net.Conn, err error) {
b := bufpool.Get(l.md.readBufferSize) b := bufpool.Get(l.md.readBufferSize)
n, raddr, dstAddr, err := tproxy.ReadFromUDP(l.ln, b) n, raddr, dstAddr, err := tproxy.ReadFromUDP(l.ln, *b)
if err != nil { if err != nil {
l.logger.Error(err) l.logger.Error(err)
return return
@ -30,7 +30,7 @@ func (l *redirectListener) accept() (conn net.Conn, err error) {
conn = &redirConn{ conn = &redirConn{
Conn: c, Conn: c,
buf: b[:n], buf: (*b)[:n],
ttl: l.md.ttl, ttl: l.md.ttl,
} }
return return