fix race condition
This commit is contained in:
@ -33,7 +33,7 @@ func CopyBuffer(dst io.Writer, src io.Reader, bufSize int) error {
|
||||
buf := bufpool.Get(bufSize)
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
_, err := io.CopyBuffer(dst, src, *buf)
|
||||
_, err := io.CopyBuffer(dst, src, buf)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,7 @@ func (r *Relay) Run() (err error) {
|
||||
b := bufpool.Get(bufSize)
|
||||
defer bufpool.Put(b)
|
||||
|
||||
n, raddr, err := r.pc1.ReadFrom(*b)
|
||||
n, raddr, err := r.pc1.ReadFrom(b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -65,7 +65,7 @@ func (r *Relay) Run() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil {
|
||||
if _, err := r.pc2.WriteTo(b[:n], raddr); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -91,7 +91,7 @@ func (r *Relay) Run() (err error) {
|
||||
b := bufpool.Get(bufSize)
|
||||
defer bufpool.Put(b)
|
||||
|
||||
n, raddr, err := r.pc2.ReadFrom(*b)
|
||||
n, raddr, err := r.pc2.ReadFrom(b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -103,7 +103,7 @@ func (r *Relay) Run() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil {
|
||||
if _, err := r.pc1.WriteTo(b[:n], raddr); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -39,13 +39,13 @@ func (c *dtlsConn) Read(p []byte) (n int, err error) {
|
||||
buf := bufpool.Get(bufferSize)
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
nn, err := c.Conn.Read(*buf)
|
||||
nn, err := c.Conn.Read(buf)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n = copy(p, (*buf)[:nn])
|
||||
c.rbuf.Write((*buf)[n:nn])
|
||||
n = copy(p, buf[:nn])
|
||||
c.rbuf.Write(buf[n:nn])
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -96,12 +96,12 @@ func (c *clientConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
for {
|
||||
n, addr, err = c.PacketConn.ReadFrom(*buf)
|
||||
n, addr, err = c.PacketConn.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
m, err := icmp.ParseMessage(1, (*buf)[:n])
|
||||
m, err := icmp.ParseMessage(1, buf[:n])
|
||||
if err != nil {
|
||||
// logger.Default().Error("icmp: parse message %v", err)
|
||||
return 0, addr, err
|
||||
@ -155,7 +155,7 @@ func (c *clientConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
msg := message{
|
||||
data: b,
|
||||
}
|
||||
nn, err := msg.Encode(*buf)
|
||||
nn, err := msg.Encode(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -163,7 +163,7 @@ func (c *clientConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
echo := icmp.Echo{
|
||||
ID: c.id,
|
||||
Seq: int(atomic.AddUint32(&c.seq, 1)),
|
||||
Data: (*buf)[:nn],
|
||||
Data: buf[:nn],
|
||||
}
|
||||
m := icmp.Message{
|
||||
Type: ipv4.ICMPTypeEcho,
|
||||
@ -195,12 +195,12 @@ func (c *serverConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
for {
|
||||
n, addr, err = c.PacketConn.ReadFrom(*buf)
|
||||
n, addr, err = c.PacketConn.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
m, err := icmp.ParseMessage(1, (*buf)[:n])
|
||||
m, err := icmp.ParseMessage(1, buf[:n])
|
||||
if err != nil {
|
||||
// logger.Default().Error("icmp: parse message %v", err)
|
||||
return 0, addr, err
|
||||
@ -260,7 +260,7 @@ func (c *serverConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
flags: FlagAck,
|
||||
data: b,
|
||||
}
|
||||
nn, err := msg.Encode(*buf)
|
||||
nn, err := msg.Encode(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -268,7 +268,7 @@ func (c *serverConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
echo := icmp.Echo{
|
||||
ID: id,
|
||||
Seq: int(atomic.LoadUint32(&c.seqs[id-1])),
|
||||
Data: (*buf)[:nn],
|
||||
Data: buf[:nn],
|
||||
}
|
||||
m := icmp.Message{
|
||||
Type: ipv4.ICMPTypeEchoReply,
|
||||
|
@ -7,6 +7,10 @@ import (
|
||||
smux "github.com/xtaci/smux"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultVersion = 2
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
// SMUX Protocol version, support 1,2
|
||||
Version int
|
||||
@ -36,6 +40,8 @@ type Config struct {
|
||||
|
||||
func convertConfig(cfg *Config) *smux.Config {
|
||||
smuxCfg := smux.DefaultConfig()
|
||||
smuxCfg.Version = defaultVersion
|
||||
|
||||
if cfg == nil {
|
||||
return smuxCfg
|
||||
}
|
||||
|
@ -375,10 +375,10 @@ func (s *Server) handlePull(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
for {
|
||||
conn.SetReadDeadline(time.Now().Add(s.options.readTimeout))
|
||||
n, err := conn.Read(*b)
|
||||
n, err := conn.Read(b)
|
||||
if n > 0 {
|
||||
bw := bufio.NewWriter(w)
|
||||
bw.WriteString(base64.StdEncoding.EncodeToString((*b)[:n]))
|
||||
bw.WriteString(base64.StdEncoding.EncodeToString(b[:n]))
|
||||
bw.WriteString("\n")
|
||||
if err := bw.Flush(); err != nil {
|
||||
return
|
||||
@ -389,8 +389,8 @@ func (s *Server) handlePull(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrDeadlineExceeded) {
|
||||
(*b)[0] = '\n' // no data
|
||||
w.Write((*b)[:1])
|
||||
b[0] = '\n' // no data
|
||||
w.Write(b[:1])
|
||||
} else if errors.Is(err, io.EOF) {
|
||||
// server connection closed
|
||||
} else {
|
||||
|
@ -110,7 +110,7 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
rbuf := bufpool.Get(c.bufferSize)
|
||||
defer bufpool.Put(rbuf)
|
||||
|
||||
n, c.raddr, err = c.PacketConn.ReadFrom(*rbuf)
|
||||
n, c.raddr, err = c.PacketConn.ReadFrom(rbuf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -119,11 +119,11 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
header := gosocks5.UDPHeader{
|
||||
Addr: &socksAddr,
|
||||
}
|
||||
hlen, err := header.ReadFrom(bytes.NewReader((*rbuf)[:n]))
|
||||
hlen, err := header.ReadFrom(bytes.NewReader(rbuf[:n]))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
n = copy(b, (*rbuf)[hlen:n])
|
||||
n = copy(b, rbuf[hlen:n])
|
||||
|
||||
addr, err = net.ResolveUDPAddr("udp", socksAddr.String())
|
||||
return
|
||||
@ -151,7 +151,7 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
Data: b,
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer((*wbuf)[:0])
|
||||
buf := bytes.NewBuffer(wbuf[:0])
|
||||
_, err = dgram.WriteTo(buf)
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -110,7 +110,7 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
rbuf := bufpool.Get(c.bufferSize)
|
||||
defer bufpool.Put(rbuf)
|
||||
|
||||
n, c.raddr, err = c.PacketConn.ReadFrom(*rbuf)
|
||||
n, c.raddr, err = c.PacketConn.ReadFrom(rbuf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -119,11 +119,11 @@ func (c *udpConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
header := gosocks5.UDPHeader{
|
||||
Addr: &socksAddr,
|
||||
}
|
||||
hlen, err := header.ReadFrom(bytes.NewReader((*rbuf)[:n]))
|
||||
hlen, err := header.ReadFrom(bytes.NewReader(rbuf[:n]))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
n = copy(b, (*rbuf)[hlen:n])
|
||||
n = copy(b, rbuf[hlen:n])
|
||||
|
||||
addr, err = net.ResolveUDPAddr("udp", socksAddr.String())
|
||||
return
|
||||
@ -151,7 +151,7 @@ func (c *udpConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
Data: b,
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer((*wbuf)[:0])
|
||||
buf := bytes.NewBuffer(wbuf[:0])
|
||||
_, err = dgram.WriteTo(buf)
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -45,18 +45,18 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
|
||||
rbuf := bufpool.Get(c.bufferSize)
|
||||
defer bufpool.Put(rbuf)
|
||||
|
||||
n, _, err = c.PacketConn.ReadFrom(*rbuf)
|
||||
n, _, err = c.PacketConn.ReadFrom(rbuf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
saddr := gosocks5.Addr{}
|
||||
addrLen, err := saddr.ReadFrom(bytes.NewReader((*rbuf)[:n]))
|
||||
addrLen, err := saddr.ReadFrom(bytes.NewReader(rbuf[:n]))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
n = copy(b, (*rbuf)[addrLen:n])
|
||||
n = copy(b, rbuf[addrLen:n])
|
||||
addr, err = net.ResolveUDPAddr("udp", saddr.String())
|
||||
|
||||
return
|
||||
@ -76,13 +76,13 @@ func (c *UDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
addrLen, err := socksAddr.Encode(*wbuf)
|
||||
addrLen, err := socksAddr.Encode(wbuf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
n = copy((*wbuf)[addrLen:], b)
|
||||
_, err = c.PacketConn.WriteTo((*wbuf)[:addrLen+n], c.raddr)
|
||||
n = copy(wbuf[addrLen:], b)
|
||||
_, err = c.PacketConn.WriteTo(wbuf[:addrLen+n], c.raddr)
|
||||
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user