This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new 0060a0e864 TIKA-4998 (#3432)
0060a0e864 is described below

commit 0060a0e86432d2bab9657305e79a192f1d54c1de
Author: Tim Allison <[email protected]>
AuthorDate: Tue Oct 27 12:06:36 2026 -0400

    TIKA-4998 (#3432)
    
    * [TIKA-4993] Upgrade poi.version from 5.5.1 to 6.0.0
    
    * Refactor cell method to use Comment interface
    
    Refactor cell method to use POI's Comment interface and deprecate the old 
method.
    
    * Fix method signature formatting in XSSFExcelExtractorDecorator
    
    Co-authored-by: Copilot Autofix powered by AI 
<[email protected]>
    
    * Refactor comment handling in XSSFExcelExtractorDecorator
    
    * TIKA-4998: bump emf limit
    
    ---------
    
    Co-authored-by: Tilman Hausherr <[email protected]>
    Co-authored-by: Copilot Autofix powered by AI 
<[email protected]>
---
 .../apache/tika/parser/microsoft/EMFParser.java    | 17 ++++++++++++
 .../renderer/microsoft/POIMetafileRenderer.java    |  5 ++++
 .../tika/parser/microsoft/EMFParserTest.java       | 30 ++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
index 89ece5004b..09d3bec35e 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
@@ -82,6 +82,23 @@ public class EMFParser extends AbstractMetafileParser {
     public static Property EMF_ICON_ONLY = 
Property.internalBoolean("emf:icon-only");
     public static Property EMF_ICON_STRING = 
Property.internalText("emf:icon-string");
 
+    /**
+     * POI 6 caps EMF comment records (e.g. an embedded WMF) at 1 MB; POI 5 
allowed
+     * 100 MB, and real files carry comments up to ~30 MB.
+     */
+    public static final int MAX_COMMENT_RECORD_LENGTH = 100_000_000;
+
+    static {
+        raiseCommentRecordLength();
+    }
+
+    /** Sets POI's static EMF comment cap; never lowers one the caller already 
raised. */
+    public static void raiseCommentRecordLength() {
+        if (HemfComment.getMaxRecordLength() < MAX_COMMENT_RECORD_LENGTH) {
+            HemfComment.setMaxRecordLength(MAX_COMMENT_RECORD_LENGTH);
+        }
+    }
+
     public EMFParser() {
         this(new MetafileParserConfig());
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
index 5281e7b07a..8036830f92 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/renderer/microsoft/POIMetafileRenderer.java
@@ -50,6 +50,7 @@ import org.apache.tika.metadata.Rendering;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.EMFParser;
 import org.apache.tika.renderer.ImageFormat;
 import org.apache.tika.renderer.ImageType;
 import org.apache.tika.renderer.RenderRequest;
@@ -83,6 +84,10 @@ public class POIMetafileRenderer implements Renderer {
     private static final Set<MediaType> SUPPORTED_TYPES =
             Collections.unmodifiableSet(new HashSet<>(Arrays.asList(EMF, 
WMF)));
 
+    static {
+        EMFParser.raiseCommentRecordLength();
+    }
+
     /** What this renderer draws when the parse scopes no settings: 800 px 
wide, RGB PNG. */
     private final RenderSettings defaults = RenderSettings.defaults();
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
index e50588678f..84088e774f 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/EMFParserTest.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -246,5 +247,34 @@ public class EMFParserTest extends TikaTest {
         assertContains("next-generation", txt);//this is stored in three 
records -- test that no spaces are interpolated
     }
 
+    /** POI 6 caps EMF comment records at 1 MB by default; 5.x allowed 100 MB. 
*/
+    @Test
+    public void testLargeWmfComment() throws Exception {
+        byte[] emf;
+        try (InputStream is = 
getResourceAsStream("/test-documents/testEMF.emf")) {
+            emf = is.readAllBytes();
+        }
+        int headerSize = ByteBuffer.wrap(emf, 4, 
4).order(ByteOrder.LITTLE_ENDIAN).getInt();
+        int wmfSize = 2_000_000;
+        int dataSize = 24 + wmfSize;
+        ByteBuffer comment = ByteBuffer.allocate(12 + 
dataSize).order(ByteOrder.LITTLE_ENDIAN);
+        comment.putInt(0x46).putInt(12 + dataSize).putInt(dataSize);
+        //"GDIC", EMR_COMMENT_WINDOWS_METAFILE, version, reserved, checksum, 
flags, size
+        comment.putInt(0x43494447).putInt(0x80000001).putShort((short) 
1).putShort((short) 0)
+                .putInt(0).putInt(0).putInt(wmfSize);
+        byte[] injected = new byte[emf.length + comment.capacity()];
+        System.arraycopy(emf, 0, injected, 0, headerSize);
+        System.arraycopy(comment.array(), 0, injected, headerSize, 
comment.capacity());
+        System.arraycopy(emf, headerSize, injected, headerSize + 
comment.capacity(),
+                emf.length - headerSize);
 
+        List<Metadata> metadataList;
+        try (TikaInputStream tis = TikaInputStream.get(injected)) {
+            metadataList = getRecursiveMetadata(tis, true);
+        }
+        Metadata container = metadataList.get(0);
+        assertNull(container.get(TikaCoreProperties.CONTAINER_EXCEPTION),
+                container.get(TikaCoreProperties.CONTAINER_EXCEPTION));
+        assertEquals("image/wmf", 
metadataList.get(1).get(HttpHeaders.CONTENT_TYPE));
+    }
 }

Reply via email to