|
@@ -2,7 +2,6 @@ package shadowsocks_2022
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"context"
|
|
"context"
|
|
|
- "runtime"
|
|
|
|
|
"time"
|
|
"time"
|
|
|
|
|
|
|
|
shadowsocks "github.com/sagernet/sing-shadowsocks"
|
|
shadowsocks "github.com/sagernet/sing-shadowsocks"
|
|
@@ -102,27 +101,25 @@ func (o *Outbound) Process(ctx context.Context, link *transport.Link, dialer int
|
|
|
if err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout {
|
|
if err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout {
|
|
|
return newError("read payload").Base(err)
|
|
return newError("read payload").Base(err)
|
|
|
}
|
|
}
|
|
|
- _payload := B.New()
|
|
|
|
|
- payload := C.Dup(_payload)
|
|
|
|
|
- defer payload.Release()
|
|
|
|
|
|
|
+ payload := B.New()
|
|
|
for {
|
|
for {
|
|
|
- payload.FullReset()
|
|
|
|
|
|
|
+ payload.Reset()
|
|
|
nb, n := buf.SplitBytes(mb, payload.FreeBytes())
|
|
nb, n := buf.SplitBytes(mb, payload.FreeBytes())
|
|
|
if n > 0 {
|
|
if n > 0 {
|
|
|
payload.Truncate(n)
|
|
payload.Truncate(n)
|
|
|
_, err = serverConn.Write(payload.Bytes())
|
|
_, err = serverConn.Write(payload.Bytes())
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
|
+ payload.Release()
|
|
|
return newError("write payload").Base(err)
|
|
return newError("write payload").Base(err)
|
|
|
}
|
|
}
|
|
|
handshake = true
|
|
handshake = true
|
|
|
}
|
|
}
|
|
|
if nb.IsEmpty() {
|
|
if nb.IsEmpty() {
|
|
|
break
|
|
break
|
|
|
- } else {
|
|
|
|
|
- mb = nb
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ mb = nb
|
|
|
}
|
|
}
|
|
|
- runtime.KeepAlive(_payload)
|
|
|
|
|
|
|
+ payload.Release()
|
|
|
}
|
|
}
|
|
|
if !handshake {
|
|
if !handshake {
|
|
|
_, err = serverConn.Write(nil)
|
|
_, err = serverConn.Write(nil)
|