fix race condition

This commit is contained in:
ginuerzh
2023-10-19 23:47:47 +08:00
parent f2fd6554ad
commit cc4310106b
29 changed files with 157 additions and 156 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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,

View File

@ -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
}

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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
}