Browse Source

fix(common): strmatcher match domain safety

mengskysama 2 years ago
parent
commit
fce86aad33
2 changed files with 9 additions and 2 deletions
  1. 5 1
      common/strmatcher/ac_automaton_matcher.go
  2. 4 1
      common/strmatcher/strmatcher_test.go

+ 5 - 1
common/strmatcher/ac_automaton_matcher.go

@@ -225,7 +225,11 @@ func (ac *ACAutomaton) Match(s string) bool {
 	// 2. the match string is through a fail edge. NOT FULL MATCH
 	// 2.1 Through a fail edge, but there exists a valid node. SUBSTR
 	for i := len(s) - 1; i >= 0; i-- {
-		idx := char2Index[s[i]]
+		chr := int(s[i])
+		if chr >= len(char2Index) {
+			return false
+		}
+		idx := char2Index[chr]
 		fullMatch = fullMatch && ac.trie[node][idx].edgeType
 		node = ac.trie[node][idx].nextNode
 		switch ac.exists[node].matchType {

+ 4 - 1
common/strmatcher/strmatcher_test.go

@@ -217,6 +217,10 @@ func TestACAutomaton(t *testing.T) {
 				pattern: "vvgoogle.com",
 				res:     true,
 			},
+			{
+				pattern: "½",
+				res:     false,
+			},
 		}
 		for _, test := range cases2Output {
 			if m := ac.Match(test.pattern); m != test.res {
@@ -224,7 +228,6 @@ func TestACAutomaton(t *testing.T) {
 			}
 		}
 	}
-
 	{
 		cases3Input := []struct {
 			pattern string