Fix bug #52446 - Handle files which have been truncated by a few bytes in NPropertyTable

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1229963 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2012-01-11 11:46:41 +00:00
parent e0198826c3
commit ee24b94d80
2 changed files with 17 additions and 1 deletions

View File

@ -34,6 +34,7 @@
<changes>
<release version="3.8-beta6" date="2012-??-??">
<action dev="poi-developers" type="fix">52446 - Handle files which have been truncated by a few bytes in NPropertyTable</action>
<action dev="poi-developers" type="fix">52438 - Update CellDateFormatter to handle times without seconds</action>
<action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action>
<action dev="poi-developers" type="add">52200 - Updated XWPF table example code </action>

View File

@ -29,6 +29,8 @@ import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.poifs.filesystem.NPOIFSStream;
import org.apache.poi.poifs.storage.HeaderBlock;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
/**
* This class embodies the Property Table for a {@link NPOIFSFileSystem};
@ -36,6 +38,8 @@ import org.apache.poi.poifs.storage.HeaderBlock;
* filesystem.
*/
public final class NPropertyTable extends PropertyTableBase {
private static final POILogger _logger =
POILogFactory.getLogger(NPropertyTable.class);
private POIFSBigBlockSize _bigBigBlockSize;
public NPropertyTable(HeaderBlock headerBlock)
@ -90,7 +94,18 @@ public final class NPropertyTable extends PropertyTableBase {
data = bb.array();
} else {
data = new byte[bigBlockSize.getBigBlockSize()];
bb.get(data, 0, data.length);
int toRead = data.length;
if (bb.remaining() < bigBlockSize.getBigBlockSize()) {
// Looks to be a truncated block
// This isn't allowed, but some third party created files
// sometimes do this, and we can normally read anyway
_logger.log(POILogger.WARN, "Short Property Block, ", bb.remaining(),
" bytes instead of the expected " + bigBlockSize.getBigBlockSize());
toRead = bb.remaining();
}
bb.get(data, 0, toRead);
}
PropertyFactory.convertToProperties(data, properties);