ソースを参照

fix buffer usage in vmess out

v2ray 9 年 前
コミット
1239b1a57b
2 ファイル変更5 行追加1 行削除
  1. 2 1
      proxy/vmess/outbound/outbound.go
  2. 3 0
      proxy/vmess/protocol/vmess.go

+ 2 - 1
proxy/vmess/outbound/outbound.go

@@ -99,6 +99,7 @@ func handleRequest(conn net.Conn, request *protocol.VMessRequest, firstPacket v2
 	encryptRequestWriter := v2crypto.NewCryptionWriter(aesStream, conn)
 
 	buffer := alloc.NewBuffer().Clear()
+	defer buffer.Clear()
 	buffer, err = request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange, buffer)
 	if err != nil {
 		log.Error("VMessOut: Failed to serialize VMess request: %v", err)
@@ -119,7 +120,6 @@ func handleRequest(conn net.Conn, request *protocol.VMessRequest, firstPacket v2
 		firstChunk.Release()
 
 		_, err = conn.Write(buffer.Value)
-		buffer.Release()
 		if err != nil {
 			log.Error("VMessOut: Failed to write VMess request: %v", err)
 			return
@@ -153,6 +153,7 @@ func handleResponse(conn net.Conn, request *protocol.VMessRequest, output chan<-
 	buffer, err := v2net.ReadFrom(decryptResponseReader, nil)
 	if err != nil {
 		log.Error("VMessOut: Failed to read VMess response (%d bytes): %v", buffer.Len(), err)
+		buffer.Release()
 		return
 	}
 	if buffer.Len() < 4 || !headerMatch(request, buffer.Value[:2]) {

+ 3 - 0
proxy/vmess/protocol/vmess.go

@@ -131,6 +131,9 @@ func (this *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
 			return nil, err
 		}
 		domainLength := int(buffer.Value[41])
+		if domainLength == 0 {
+			return nil, transport.CorruptedPacket
+		}
 		_, err = v2net.ReadAllBytes(decryptor, buffer.Value[42:42+domainLength])
 		if err != nil {
 			return nil, err