From 7df35ac1226a30485fca7e454e88cee1f5ed5b6d Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Tue, 13 Oct 2026 09:30:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8E=8B=E7=BC=A9=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9B=BE=E5=83=8F=E5=8E=8B=E7=BC=A9=E4=B8=8E?= =?UTF-8?q?=E8=92=99=E7=89=88=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_compression.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/ofdgo_compression.go b/ofdgo_compression.go index 393e251..bcd5c68 100644 --- a/ofdgo_compression.go +++ b/ofdgo_compression.go @@ -26,6 +26,7 @@ import ( "image" "io" "maps" + "path" "slices" "strings" "unicode/utf8" @@ -216,14 +217,18 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo) return nil, false, err } buffer := bufio.NewReader(imageInput{ReadCloser: input, context: ctx}) - header, _ := buffer.Peek(512) - header = bytes.TrimSpace(bytes.TrimPrefix(header, []byte{0xef, 0xbb, 0xbf})) - if structured || len(header) > 0 && header[0] == '<' { + found, err := editorXMLPrefix(buffer) + if err != nil || !found && (structured || strings.EqualFold(path.Ext(name), ".xml")) { + safe = false + } + if safe && found { decoder := xml.NewDecoder(buffer) var stack []xml.Name + seen := false for { token, err := decoder.Token() if err == io.EOF { + safe = seen && len(stack) == 0 break } if err != nil { @@ -232,6 +237,11 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo) } switch element := token.(type) { 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 { safe = false break @@ -267,6 +277,10 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo) } case xml.EndElement: 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: safe = false }