aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/poi
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2011-03-25 18:02:46 +0000
committerNick Burch <nick@apache.org>2011-03-25 18:02:46 +0000
commit27a258e58116e5909b604067efd28b4c5fd6def9 (patch)
treee1d66f71b01e8c081c4a093ef31a384b620e28ec /src/java/org/apache/poi
parentec4691b4096b6d4c08bcf6126fc2952142a285e1 (diff)
downloadpoi-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')
-rw-r--r--src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java8
-rw-r--r--src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java3
-rw-r--r--src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java6
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;