mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
1 parent
a3594d1280
commit
7df35ac122
1 file changed
+17
-3
+17
-3
@@ -26,6 +26,7 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"io"
|
"io"
|
||||||
"maps"
|
"maps"
|
||||||
|
"path"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
@@ -216,14 +217,18 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
|
|||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
buffer := bufio.NewReader(imageInput{ReadCloser: input, context: ctx})
|
buffer := bufio.NewReader(imageInput{ReadCloser: input, context: ctx})
|
||||||
header, _ := buffer.Peek(512)
|
found, err := editorXMLPrefix(buffer)
|
||||||
header = bytes.TrimSpace(bytes.TrimPrefix(header, []byte{0xef, 0xbb, 0xbf}))
|
if err != nil || !found && (structured || strings.EqualFold(path.Ext(name), ".xml")) {
|
||||||
if structured || len(header) > 0 && header[0] == '<' {
|
safe = false
|
||||||
|
}
|
||||||
|
if safe && found {
|
||||||
decoder := xml.NewDecoder(buffer)
|
decoder := xml.NewDecoder(buffer)
|
||||||
var stack []xml.Name
|
var stack []xml.Name
|
||||||
|
seen := false
|
||||||
for {
|
for {
|
||||||
token, err := decoder.Token()
|
token, err := decoder.Token()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
safe = seen && len(stack) == 0
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -232,6 +237,11 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
|
|||||||
}
|
}
|
||||||
switch element := token.(type) {
|
switch element := token.(type) {
|
||||||
case xml.StartElement:
|
case xml.StartElement:
|
||||||
|
if len(stack) == 0 && seen {
|
||||||
|
safe = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
seen = true
|
||||||
if len(stack) != 0 && classifyOFDNamespace(element.Name.Space) == ofdXMLUnknown && element.Name.Space != stack[len(stack)-1].Space {
|
if len(stack) != 0 && classifyOFDNamespace(element.Name.Space) == ofdXMLUnknown && element.Name.Space != stack[len(stack)-1].Space {
|
||||||
safe = false
|
safe = false
|
||||||
break
|
break
|
||||||
@@ -267,6 +277,10 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
|
|||||||
}
|
}
|
||||||
case xml.EndElement:
|
case xml.EndElement:
|
||||||
stack = stack[:len(stack)-1]
|
stack = stack[:len(stack)-1]
|
||||||
|
case xml.CharData:
|
||||||
|
if len(stack) == 0 && len(bytes.Trim(element, " \t\r\n")) != 0 {
|
||||||
|
safe = false
|
||||||
|
}
|
||||||
case xml.Directive:
|
case xml.Directive:
|
||||||
safe = false
|
safe = false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user