From: Andreas Beeker Date: Tue, 30 Dec 2014 02:20:57 +0000 (+0000) Subject: Bug 56240 - Handle PP97_DUALSTORAGE streams X-Git-Tag: REL_3_12_BETA1~59 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2b83ab670ade75ca3911493fd7d547f7c224cd43;p=poi.git Bug 56240 - Handle PP97_DUALSTORAGE streams git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1648466 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java index 3c63317c62..55c3f6f876 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java @@ -173,9 +173,8 @@ public final class HSLFSlideShow extends POIDocument { * @param dir the POIFS directory to read from * @throws IOException if there is a problem while parsing the document. */ - public HSLFSlideShow(DirectoryNode dir) throws IOException - { - super(dir); + public HSLFSlideShow(DirectoryNode dir) throws IOException { + super(handleDualStorage(dir)); // First up, grab the "Current User" stream // We need this before we can detect Encrypted Documents @@ -192,7 +191,13 @@ public final class HSLFSlideShow extends POIDocument { readOtherStreams(); } - + private static DirectoryNode handleDualStorage(DirectoryNode dir) throws IOException { + // when there's a dual storage entry, use it, as the outer document can't be read quite probably ... + String dualName = "PP97_DUALSTORAGE"; + if (!dir.hasEntry(dualName)) return dir; + dir = (DirectoryNode)dir.getEntry(dualName); + return dir; + } /** * Constructs a new, empty, Powerpoint document. diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 6e7663d269..d3a759c9bf 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -610,4 +610,19 @@ public final class TestBugs { inputStream.close(); } } + + @Test + public void bug56240() throws Exception { + InputStream inputStream = new FileInputStream(_slTests.getFile("bug56240.ppt")); + try { + SlideShow slideShow = new SlideShow(inputStream); + int slideCnt = slideShow.getSlides().length; + assertEquals(105, slideCnt); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + slideShow.write(bos); + bos.close(); + } finally { + inputStream.close(); + } + } } diff --git a/test-data/slideshow/bug56240.ppt b/test-data/slideshow/bug56240.ppt new file mode 100644 index 0000000000..908f2ccb06 Binary files /dev/null and b/test-data/slideshow/bug56240.ppt differ