From 9a6bd3902ddc547f213ef3cf53eb612574f37f30 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 26 Mar 2025 20:52:10 +0000 Subject: [PATCH] [bug-69628] add test case git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1924643 13f79535-47bb-0310-9956-ffa450edef68 --- .../openxml4j/util/ZipArchiveFakeEntry.java | 8 ++- .../poi/xwpf/usermodel/TestXWPFBugs.java | 60 +++++++++++++----- test-data/document/bug69628.docx | Bin 0 -> 7510 bytes 3 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 test-data/document/bug69628.docx diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipArchiveFakeEntry.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipArchiveFakeEntry.java index afe5e56ebd..cc780561df 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipArchiveFakeEntry.java +++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/util/ZipArchiveFakeEntry.java @@ -44,7 +44,11 @@ public final class ZipArchiveFakeEntry extends ZipArchiveEntry implements Closea private static int MAX_ENTRY_SIZE = DEFAULT_MAX_ENTRY_SIZE; public static void setMaxEntrySize(int maxEntrySize) { - MAX_ENTRY_SIZE = maxEntrySize; + if(maxEntrySize < 0) { + MAX_ENTRY_SIZE = DEFAULT_MAX_ENTRY_SIZE; + } else { + MAX_ENTRY_SIZE = maxEntrySize; + } } public static int getMaxEntrySize() { @@ -61,7 +65,7 @@ public final class ZipArchiveFakeEntry extends ZipArchiveEntry implements Closea final long entrySize = entry.getSize(); final int threshold = ZipInputStreamZipEntrySource.getThresholdBytesForTempFiles(); - if (threshold >= 0 && entrySize >= threshold) { + if (threshold >= 0 && (entrySize >= threshold || entrySize == -1)) { if (ZipInputStreamZipEntrySource.shouldEncryptTempFiles()) { encryptedTempData = new EncryptedTempData(); try (OutputStream os = encryptedTempData.getOutputStream()) { diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java index 8afaaecb2d..484d37b6a3 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java @@ -28,6 +28,9 @@ import java.io.IOException; import java.math.BigInteger; import java.util.List; +import org.apache.poi.openxml4j.util.ZipArchiveFakeEntry; +import org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource; +import org.apache.poi.util.IOUtils; import org.apache.poi.util.Units; import org.apache.poi.xwpf.XWPFTestDataSamples; import org.apache.poi.xwpf.usermodel.XWPFRun.FontCharRange; @@ -149,22 +152,22 @@ class TestXWPFBugs { } } - /** - * Removing a run needs to take into account position of run if paragraph contains hyperlink runs - */ - @Test - void test58618() throws IOException { - try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("58618.docx")) { - XWPFParagraph para = (XWPFParagraph) doc.getBodyElements().get(0); - assertNotNull(para); - assertEquals("Some text some hyper links link link and some text.....", para.getText()); - XWPFRun run = para.insertNewRun(para.getRuns().size()); - run.setText("New Text"); - assertEquals("Some text some hyper links link link and some text.....New Text", para.getText()); - para.removeRun(para.getRuns().size() - 2); - assertEquals("Some text some hyper links link linkNew Text", para.getText()); - } - } + /** + * Removing a run needs to take into account position of run if paragraph contains hyperlink runs + */ + @Test + void test58618() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("58618.docx")) { + XWPFParagraph para = (XWPFParagraph) doc.getBodyElements().get(0); + assertNotNull(para); + assertEquals("Some text some hyper links link link and some text.....", para.getText()); + XWPFRun run = para.insertNewRun(para.getRuns().size()); + run.setText("New Text"); + assertEquals("Some text some hyper links link link and some text.....New Text", para.getText()); + para.removeRun(para.getRuns().size() - 2); + assertEquals("Some text some hyper links link linkNew Text", para.getText()); + } + } @Test void test59378() throws IOException { @@ -329,7 +332,7 @@ class TestXWPFBugs { } } - private static void addNumberingWithAbstractId(XWPFNumbering documentNumbering, int id){ + private static void addNumberingWithAbstractId(XWPFNumbering documentNumbering, int id) { // create a numbering scheme CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance(); // give the scheme an ID @@ -340,4 +343,27 @@ class TestXWPFBugs { documentNumbering.addNum(abstractNumID); } + + @Test + void testBug69628() throws IOException { + final int expectedParagraphs = 24; + // bug69628.docx has -1 entry sizes in the zip data + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("bug69628.docx")) { + assertEquals(expectedParagraphs, doc.getParagraphs().size()); + } + // test again with smaller byte array max + ZipArchiveFakeEntry.setMaxEntrySize(30 * 1024 * 1024); + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("bug69628.docx")) { + assertEquals(expectedParagraphs, doc.getParagraphs().size()); + } finally { + ZipArchiveFakeEntry.setMaxEntrySize(-1); + } + // test again but temp files enabled + ZipInputStreamZipEntrySource.setThresholdBytesForTempFiles(1000); + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("bug69628.docx")) { + assertEquals(expectedParagraphs, doc.getParagraphs().size()); + } finally { + ZipInputStreamZipEntrySource.setThresholdBytesForTempFiles(-1); + } + } } diff --git a/test-data/document/bug69628.docx b/test-data/document/bug69628.docx new file mode 100644 index 0000000000000000000000000000000000000000..359a3b360864a85c636ad7a8eebbb055f29d1cf6 GIT binary patch literal 7510 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 y{{HQv_SaN