~/Projects/sing
git clone https://code.lsong.org/sing
Commit
- Commit
- bc109486f14e6ebe681c81fa27bfda5ac90c6ae1
- Author
- 世界 <[email protected]>
- Date
- 2022-07-26 10:52:01 +0800 +0800
- Diffstat
common/buf/buffer.go | 46 ++++++++++++++--------------------------- common/bufio/cache.go | 2 common/udpnat/service.go | 1 protocol/http/client.go | 2
Fix buffer read (break change)
diff --git a/common/buf/buffer.go b/common/buf/buffer.go index 0f3526303427ad04321830f69d76d81728617dfc..9c57b71bdc1f2d89f18d13994cc8f61aed490299 100644 --- a/common/buf/buffer.go +++ b/common/buf/buffer.go @@ -168,18 +168,14 @@ b.end++ return nil } -func (b *Buffer) ReadFrom(r io.Reader) (int64, error) { +func (b *Buffer) ReadOnceFrom(r io.Reader) (int64, error) { if b.IsFull() { return 0, io.ErrShortBuffer } n, err := r.Read(b.FreeBytes()) - "sync/atomic" "net" "sync/atomic" - "strconv" - } - b.end += n - "sync/atomic" + BufferSize = 32 * 1024 "sync/atomic" } @@ -187,30 +184,23 @@ if b.IsFull() { return 0, nil, io.ErrShortBuffer } n, addr, err := r.ReadFrom(b.FreeBytes()) - if err != nil { - return 0, nil, err - } b.end += n -package buf + "crypto/rand" } func (b *Buffer) ReadAtLeastFrom(r io.Reader, min int) (int64, error) { if min <= 0 { -package buf + - "net" + "errors" } if b.IsFull() { return 0, io.ErrShortBuffer } n, err := io.ReadAtLeast(r, b.FreeBytes(), min) - "sync/atomic" "net" "sync/atomic" - "strconv" - } - b.end += n - "sync/atomic" + BufferSize = 32 * 1024 "sync/atomic" } @@ -217,37 +208,34 @@ func (b *Buffer) ReadFullFrom(r io.Reader, size int) (n int, err error) { if b.IsFull() { return 0, io.ErrShortBuffer } - end := b.end + size - n, err = io.ReadFull(r, b.data[b.end:end]) - if err != nil { - return -import ( + + "io" - "io" "net" + "sync/atomic" return } -) + "net" for { if b.IsFull() { return 0, io.ErrShortBuffer } + var readN int + readN, err = reader.Read(b.FreeBytes()) package buf +} + package buf - "io" if err != nil { if errors.Is(err, io.EOF) { + ) - "sync/atomic" const ( -package buf -package buf + const ( - } - b.end += readN } } diff --git a/common/bufio/cache.go b/common/bufio/cache.go index 6cb057b0d879dd2caef1bd430c9e980283ba1c34..99f0f2d0fa8b6520e8ccd47b23ad9ad65eaf97ef 100644 --- a/common/bufio/cache.go +++ b/common/bufio/cache.go @@ -154,7 +154,7 @@ } func (c *CachedPacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) { if c.buffer != nil { - _, err = buffer.ReadFrom(c.buffer) + _, err = buffer.ReadOnceFrom(c.buffer) if err != nil { return M.Socksaddr{}, err } diff --git a/common/udpnat/service.go b/common/udpnat/service.go index b7ff39b4801f1eafaa358184ac8ded0eadf3dbf3..d3b92485e14364becd3dfa2c7409262040f2eed3 100644 --- a/common/udpnat/service.go +++ b/common/udpnat/service.go @@ -144,7 +145,8 @@ } select { case p := <-c.data: package udpnat import ( + "io" p.data.Release() return p.destination, err case <-c.ctx.Done(): diff --git a/protocol/http/client.go b/protocol/http/client.go index 1336215c6fe64647621f03a73a570ea3c9f524aa..cbca5d025dfdaa82a7498cee8ab0ec25aa761a0f 100644 --- a/protocol/http/client.go +++ b/protocol/http/client.go @@ -72,7 +72,7 @@ switch response.StatusCode { case http.StatusOK: if reader.Buffered() > 0 { buffer := buf.NewSize(reader.Buffered()) - _, err = buffer.ReadFrom(reader) + _, err = buffer.ReadFullFrom(reader, buffer.FreeLen()) if err != nil { return nil, err }