Improve efficiency in FindRenderizableReferenceNumeric and getReferences (#16251)

* Fuzzer finds an NPE due to incorrect URLPrefix

The Fuzzer is running on a non-repo urlprefix which is incorrect for RenderRaw


* Make FindRenderizableReferenceNumeric and getReferences more efficient

Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
zeripath 2021-06-26 00:11:33 +01:00 committed by GitHub
parent 9b33d18899
commit 62a4879e84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 7 deletions

View File

@ -5,6 +5,7 @@
package references package references
import ( import (
"bytes"
"net/url" "net/url"
"regexp" "regexp"
"strconv" "strconv"
@ -14,6 +15,8 @@ import (
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/mdstripper" "code.gitea.io/gitea/modules/markup/mdstripper"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"github.com/yuin/goldmark/util"
) )
var ( var (
@ -321,7 +324,7 @@ func FindRenderizableReferenceNumeric(content string, prOnly bool) (bool, *Rende
return false, nil return false, nil
} }
} }
r := getCrossReference([]byte(content), match[2], match[3], false, prOnly) r := getCrossReference(util.StringToReadOnlyBytes(content), match[2], match[3], false, prOnly)
if r == nil { if r == nil {
return false, nil return false, nil
} }
@ -465,18 +468,17 @@ func findAllIssueReferencesBytes(content []byte, links []string) []*rawReference
} }
func getCrossReference(content []byte, start, end int, fromLink bool, prOnly bool) *rawReference { func getCrossReference(content []byte, start, end int, fromLink bool, prOnly bool) *rawReference {
refid := string(content[start:end]) sep := bytes.IndexAny(content[start:end], "#!")
sep := strings.IndexAny(refid, "#!")
if sep < 0 { if sep < 0 {
return nil return nil
} }
isPull := refid[sep] == '!' isPull := content[start+sep] == '!'
if prOnly && !isPull { if prOnly && !isPull {
return nil return nil
} }
repo := refid[:sep] repo := string(content[start : start+sep])
issue := refid[sep+1:] issue := string(content[start+sep+1 : end])
index, err := strconv.ParseInt(issue, 10, 64) index, err := strconv.ParseInt(string(issue), 10, 64)
if err != nil { if err != nil {
return nil return nil
} }