فهرست منبع

Detect SVG using lexer instead of encoding/xml

DarthSim 2 سال پیش
والد
کامیت
05be115f38
1فایلهای تغییر یافته به همراه12 افزوده شده و 41 حذف شده
  1. 12 41
      imagemeta/svg.go

+ 12 - 41
imagemeta/svg.go

@@ -1,60 +1,31 @@
 package imagemeta
 
 import (
-	"bytes"
-	"encoding/xml"
-	"fmt"
 	"io"
 	"strings"
 
 	"github.com/imgproxy/imgproxy/v3/config"
-	"golang.org/x/text/encoding/charmap"
-)
-
-type svgHeader struct {
-	XMLName xml.Name
-}
 
-func xmlCharsetReader(charset string, input io.Reader) (io.Reader, error) {
-	if strings.EqualFold(charset, "iso-8859-1") {
-		return charmap.ISO8859_1.NewDecoder().Reader(input), nil
-	}
-	return nil, fmt.Errorf("Unknown SVG charset: %s", charset)
-}
+	"github.com/tdewolff/parse/v2"
+	"github.com/tdewolff/parse/v2/xml"
+)
 
 func IsSVG(r io.Reader) (bool, error) {
 	maxBytes := config.MaxSvgCheckBytes
 
-	var h svgHeader
-
-	buf := make([]byte, 0, maxBytes)
-	b := make([]byte, 1024)
-
-	rr := bytes.NewReader(buf)
+	l := xml.NewLexer(parse.NewInput(io.LimitReader(r, int64(maxBytes))))
 
 	for {
-		n, err := r.Read(b)
-		if err != nil && err != io.EOF {
-			return false, err
-		}
-		if n <= 0 {
-			return false, nil
-		}
-
-		buf = append(buf, b[:n]...)
-		rr.Reset(buf)
+		tt, _ := l.Next()
 
-		dec := xml.NewDecoder(rr)
-		dec.Strict = false
-		dec.CharsetReader = xmlCharsetReader
-		if dec.Decode(&h); h.XMLName.Local == "svg" {
-			return true, nil
-		}
+		switch tt {
+		case xml.ErrorToken:
+			return false, nil
 
-		if len(buf) >= maxBytes {
-			break
+		case xml.StartTagToken:
+			if strings.ToLower(string(l.Text())) == "svg" {
+				return true, nil
+			}
 		}
 	}
-
-	return false, nil
 }