Browse Source

Fix copy pipe

世界 3 years ago
parent
commit
95c03c9373
1 changed files with 15 additions and 11 deletions
  1. 15 11
      outbound/default.go

+ 15 - 11
outbound/default.go

@@ -3,6 +3,7 @@ package outbound
 import (
 	"context"
 	"net"
+	"os"
 	"runtime"
 	"time"
 
@@ -136,22 +137,25 @@ func CopyEarlyConn(ctx context.Context, conn net.Conn, serverConn net.Conn) erro
 	_payload := buf.StackNew()
 	payload := common.Dup(_payload)
 	err := conn.SetReadDeadline(time.Now().Add(C.ReadPayloadTimeout))
-	if err != nil {
-		return err
-	}
-	_, err = payload.ReadOnceFrom(conn)
-	if err != nil && !E.IsTimeout(err) {
-		return E.Cause(err, "read payload")
-	}
-	err = conn.SetReadDeadline(time.Time{})
-	if err != nil {
-		payload.Release()
-		return err
+	if err != os.ErrInvalid {
+		if err != nil {
+			return err
+		}
+		_, err = payload.ReadOnceFrom(conn)
+		if err != nil && !E.IsTimeout(err) {
+			return E.Cause(err, "read payload")
+		}
+		err = conn.SetReadDeadline(time.Time{})
+		if err != nil {
+			payload.Release()
+			return err
+		}
 	}
 	_, err = serverConn.Write(payload.Bytes())
 	if err != nil {
 		return N.HandshakeFailure(conn, err)
 	}
 	runtime.KeepAlive(_payload)
+	payload.Release()
 	return bufio.CopyConn(ctx, conn, serverConn)
 }