mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 00:54:43 +01:00 
			
		
		
		
	Fix isAllowed of escapeStreamer (#22814)
The use of `sort.Search` is wrong: The slice should be sorted, and `return >= 0` doen't mean it exists, see the [manual](https://pkg.go.dev/sort#Search). Could be fixed like this if we really need it: ```diff diff --git a/modules/charset/escape_stream.go b/modules/charset/escape_stream.go index 823b63513..fcf1ffbc1 100644 --- a/modules/charset/escape_stream.go +++ b/modules/charset/escape_stream.go @@ -20,6 +20,9 @@ import ( var defaultWordRegexp = regexp.MustCompile(`(-?\d*\.\d\w*)|([^\` + "`" + `\~\!\@\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s\x00-\x1f]+)`) func NewEscapeStreamer(locale translation.Locale, next HTMLStreamer, allowed ...rune) HTMLStreamer { + sort.Slice(allowed, func(i, j int) bool { + return allowed[i] < allowed[j] + }) return &escapeStreamer{ escaped: &EscapeStatus{}, PassthroughHTMLStreamer: *NewPassthroughStreamer(next), @@ -284,14 +287,8 @@ func (e *escapeStreamer) runeTypes(runes ...rune) (types []runeType, confusables } func (e *escapeStreamer) isAllowed(r rune) bool { - if len(e.allowed) == 0 { - return false - } - if len(e.allowed) == 1 { - return e.allowed[0] == r - } - - return sort.Search(len(e.allowed), func(i int) bool { + i := sort.Search(len(e.allowed), func(i int) bool { return e.allowed[i] >= r - }) >= 0 + }) + return i < len(e.allowed) && e.allowed[i] == r } ``` But I don't think so, a map is better to do it.
This commit is contained in:
		
							parent
							
								
									29aea3642f
								
							
						
					
					
						commit
						e253888a0e
					
				| @ -6,7 +6,6 @@ package charset | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"regexp" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
| @ -20,12 +19,16 @@ import ( | ||||
| var defaultWordRegexp = regexp.MustCompile(`(-?\d*\.\d\w*)|([^\` + "`" + `\~\!\@\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s\x00-\x1f]+)`) | ||||
| 
 | ||||
| func NewEscapeStreamer(locale translation.Locale, next HTMLStreamer, allowed ...rune) HTMLStreamer { | ||||
| 	allowedM := make(map[rune]bool, len(allowed)) | ||||
| 	for _, v := range allowed { | ||||
| 		allowedM[v] = true | ||||
| 	} | ||||
| 	return &escapeStreamer{ | ||||
| 		escaped:                 &EscapeStatus{}, | ||||
| 		PassthroughHTMLStreamer: *NewPassthroughStreamer(next), | ||||
| 		locale:                  locale, | ||||
| 		ambiguousTables:         AmbiguousTablesForLocale(locale), | ||||
| 		allowed:                 allowed, | ||||
| 		allowed:                 allowedM, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -34,7 +37,7 @@ type escapeStreamer struct { | ||||
| 	escaped         *EscapeStatus | ||||
| 	locale          translation.Locale | ||||
| 	ambiguousTables []*AmbiguousTable | ||||
| 	allowed         []rune | ||||
| 	allowed         map[rune]bool | ||||
| } | ||||
| 
 | ||||
| func (e *escapeStreamer) EscapeStatus() *EscapeStatus { | ||||
| @ -256,7 +259,7 @@ func (e *escapeStreamer) runeTypes(runes ...rune) (types []runeType, confusables | ||||
| 			runeCounts.numBrokenRunes++ | ||||
| 		case r == ' ' || r == '\t' || r == '\n': | ||||
| 			runeCounts.numBasicRunes++ | ||||
| 		case e.isAllowed(r): | ||||
| 		case e.allowed[r]: | ||||
| 			if r > 0x7e || r < 0x20 { | ||||
| 				types[i] = nonBasicASCIIRuneType | ||||
| 				runeCounts.numNonConfusingNonBasicRunes++ | ||||
| @ -282,16 +285,3 @@ func (e *escapeStreamer) runeTypes(runes ...rune) (types []runeType, confusables | ||||
| 	} | ||||
| 	return types, confusables, runeCounts | ||||
| } | ||||
| 
 | ||||
| func (e *escapeStreamer) isAllowed(r rune) bool { | ||||
| 	if len(e.allowed) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	if len(e.allowed) == 1 { | ||||
| 		return e.allowed[0] == r | ||||
| 	} | ||||
| 
 | ||||
| 	return sort.Search(len(e.allowed), func(i int) bool { | ||||
| 		return e.allowed[i] >= r | ||||
| 	}) >= 0 | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user