소스 검색

check payload length before decrypting it. fixes #1227

Darien Raymond 7 년 전
부모
커밋
63c7f5e686
2개의 변경된 파일40개의 추가작업 그리고 0개의 파일을 삭제
  1. 4 0
      transport/internet/kcp/io.go
  2. 36 0
      transport/internet/kcp/io_test.go

+ 4 - 0
transport/internet/kcp/io.go

@@ -30,6 +30,10 @@ func (r *KCPPacketReader) Read(b []byte) []Segment {
 	}
 	if r.Security != nil {
 		nonceSize := r.Security.NonceSize()
+		overhead := r.Security.Overhead()
+		if len(b) <= nonceSize+overhead {
+			return nil
+		}
 		out, err := r.Security.Open(b[nonceSize:nonceSize], b[:nonceSize], b[nonceSize:], nil)
 		if err != nil {
 			return nil

+ 36 - 0
transport/internet/kcp/io_test.go

@@ -1 +1,37 @@
 package kcp_test
+
+import (
+	"testing"
+
+	. "v2ray.com/core/transport/internet/kcp"
+)
+
+func TestKCPPacketReader(t *testing.T) {
+	reader := KCPPacketReader{
+		Security: &SimpleAuthenticator{},
+	}
+
+	testCases := []struct {
+		Input  []byte
+		Output []Segment
+	}{
+		{
+			Input:  []byte{},
+			Output: nil,
+		},
+		{
+			Input:  []byte{1},
+			Output: nil,
+		},
+	}
+
+	for _, testCase := range testCases {
+		seg := reader.Read(testCase.Input)
+		if testCase.Output == nil && seg != nil {
+			t.Errorf("Expect nothing returned, but actually %v", seg)
+		} else if testCase.Output != nil && seg == nil {
+			t.Errorf("Expect some output, but got nil")
+		}
+	}
+
+}