From e9f442ffa7eb4242393183af8165a2faf874a338 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 26 May 2015 13:56:40 +0000 Subject: [PATCH] Fix testing for NPOIFS zero-length stream writing git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1681762 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/poifs/filesystem/NPOIFSDocument.java | 4 --- .../poi/poifs/filesystem/NPOIFSStream.java | 6 ++-- .../filesystem/TestNPOIFSFileSystem.java | 33 +++++++++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java index 9492c25983..bdc35cee71 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java @@ -143,10 +143,6 @@ public final class NPOIFSDocument implements POIFSViewable { os.write(buf, 0, readBytes); } - // If this is an empty document, write a single byte - // to force a block allocation for this document - if (length == 0) os.write(0); - // Tidy and return the length os.close(); return length; diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java index 5d444b8cb9..da24fc3836 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java @@ -256,8 +256,10 @@ public class NPOIFSStream implements Iterable NPOIFSStream toFree = new NPOIFSStream(blockStore, nextBlock); toFree.free(loopDetector); - // Mark the end of the stream - blockStore.setNextBlock(prevBlock, POIFSConstants.END_OF_CHAIN); + // Mark the end of the stream, if we have any data + if (prevBlock != POIFSConstants.END_OF_CHAIN) { + blockStore.setNextBlock(prevBlock, POIFSConstants.END_OF_CHAIN); + } } } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java index 69c6cacf68..75161b9f83 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java @@ -1336,8 +1336,6 @@ public final class TestNPOIFSFileSystem { } } - // TODO Should these have a mini-sbat entry or not? - // TODO Is the reading of zero-length properties exactly correct? @Test public void writeZeroLengthEntries() throws Exception { NPOIFSFileSystem fs = new NPOIFSFileSystem(); @@ -1378,6 +1376,37 @@ public final class TestNPOIFSFileSystem { emptyDoc = (DocumentEntry)testDir.getEntry("empty-3"); assertContentsMatches(empty, emptyDoc); + // Look at the properties entry, and check the empty ones + // have zero size and no start block + NPropertyTable props = fs._get_property_table(); + Iterator propsIt = props.getRoot().getChildren(); + + Property prop = propsIt.next(); + assertEquals("Mini2", prop.getName()); + assertEquals(0, prop.getStartBlock()); + assertEquals(7, prop.getSize()); + + prop = propsIt.next(); + assertEquals("Normal4106", prop.getName()); + assertEquals(4, prop.getStartBlock()); // BAT, Props, SBAT, MIni + assertEquals(4106, prop.getSize()); + + prop = propsIt.next(); + assertEquals("empty-1", prop.getName()); + assertEquals(POIFSConstants.END_OF_CHAIN, prop.getStartBlock()); + assertEquals(0, prop.getSize()); + + prop = propsIt.next(); + assertEquals("empty-2", prop.getName()); + assertEquals(POIFSConstants.END_OF_CHAIN, prop.getStartBlock()); + assertEquals(0, prop.getSize()); + + prop = propsIt.next(); + assertEquals("empty-3", prop.getName()); + assertEquals(POIFSConstants.END_OF_CHAIN, prop.getStartBlock()); + assertEquals(0, prop.getSize()); + + // Save and re-check fs = writeOutAndReadBack(fs); testDir = fs.getRoot(); -- 2.39.5