diff options
author | Nick Burch <nick@apache.org> | 2011-03-25 18:02:46 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2011-03-25 18:02:46 +0000 |
commit | 27a258e58116e5909b604067efd28b4c5fd6def9 (patch) | |
tree | e1d66f71b01e8c081c4a093ef31a384b620e28ec /src/java/org/apache/poi | |
parent | ec4691b4096b6d4c08bcf6126fc2952142a285e1 (diff) | |
download | poi-27a258e58116e5909b604067efd28b4c5fd6def9.tar.gz poi-27a258e58116e5909b604067efd28b4c5fd6def9.zip |
Fix a couple of NPOIFS bugs relating to empty files, empty documents and non-padded stream data
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1085493 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/poi')
3 files changed, 14 insertions, 3 deletions
diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java index 3a2c286023..484914e54c 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java @@ -24,6 +24,7 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Collections; import java.util.Iterator; +import java.util.List; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.dev.POIFSViewable; @@ -106,7 +107,12 @@ public final class NPOIFSDocument implements POIFSViewable { } Iterator<ByteBuffer> getBlockIterator() { - return _stream.getBlockIterator(); + if(getSize() > 0) { + return _stream.getBlockIterator(); + } else { + List<ByteBuffer> empty = Collections.emptyList(); + return empty.iterator(); + } } /** diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java index 58d77be69a..b15df9bd4c 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java @@ -103,6 +103,9 @@ public class NPOIFSFileSystem extends BlockStore _xbat_blocks = new ArrayList<BATBlock>(); _bat_blocks = new ArrayList<BATBlock>(); _root = null; + + // Data needs to initially hold just the header block + _data = new ByteArrayBackedDataSource(new byte[bigBlockSize.getBigBlockSize()]); } /** diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java index 458100950d..5d8d1fa882 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java @@ -102,7 +102,7 @@ public class NPOIFSStream implements Iterable<ByteBuffer> public void updateContents(byte[] contents) throws IOException { // How many blocks are we going to need? int blockSize = blockStore.getBlockStoreBlockSize(); - int blocks = (int)Math.ceil(contents.length / blockSize); + int blocks = (int)Math.ceil( ((double)contents.length) / blockSize ); // Make sure we don't encounter a loop whilst overwriting // the existing blocks @@ -141,7 +141,9 @@ public class NPOIFSStream implements Iterable<ByteBuffer> // Write it ByteBuffer buffer = blockStore.createBlockIfNeeded(thisBlock); - buffer.put(contents, i*blockSize, blockSize); + int startAt = i*blockSize; + int endAt = Math.min(contents.length - startAt, blockSize); + buffer.put(contents, startAt, endAt); // Update pointers prevBlock = thisBlock; |