diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 45adb130d6..139408242d 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52446 - Handle files which have been truncated by a few bytes in NPropertyTable 52438 - Update CellDateFormatter to handle times without seconds 52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching 52200 - Updated XWPF table example code diff --git a/src/java/org/apache/poi/poifs/property/NPropertyTable.java b/src/java/org/apache/poi/poifs/property/NPropertyTable.java index f1d470eb48..4f3a1968e6 100644 --- a/src/java/org/apache/poi/poifs/property/NPropertyTable.java +++ b/src/java/org/apache/poi/poifs/property/NPropertyTable.java @@ -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);