Liu Song’s Projects


~/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
 			}