Fix bug 44898 - Correctly handle short last blocks in POIFS

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@658285 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2008-05-20 15:42:16 +00:00
parent 6b19217c3d
commit 8536301aab
5 changed files with 25 additions and 13 deletions

View File

@ -37,7 +37,7 @@
<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.1-final" date="2008-06-??"> <release version="3.1-final" date="2008-06-??">
<action dev="POI-DEVELOPERS" type="add"><!-- to keep XML validator quiet --></action> <action dev="POI-DEVELOPERS" type="fix">44898 - Correctly handle short last blocks in POIFS</action>
</release> </release>
<release version="3.1-beta2" date="2008-05-26"> <release version="3.1-beta2" date="2008-05-26">
<action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action> <action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action>

View File

@ -34,6 +34,7 @@
<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.1-final" date="2008-06-??"> <release version="3.1-final" date="2008-06-??">
<action dev="POI-DEVELOPERS" type="fix">44898 - Correctly handle short last blocks in POIFS</action>
</release> </release>
<release version="3.1-beta2" date="2008-05-26"> <release version="3.1-beta2" date="2008-05-26">
<action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action> <action dev="POI-DEVELOPERS" type="fix">44306 - fixed reading/writing of AttrPtg(type=choose) and method toFormulaString() for CHOOSE formulas</action>

View File

@ -37,6 +37,7 @@ public class RawDataBlock
{ {
private byte[] _data; private byte[] _data;
private boolean _eof; private boolean _eof;
private boolean _hasData;
private static POILogger log = POILogFactory.getLogger(RawDataBlock.class); private static POILogger log = POILogFactory.getLogger(RawDataBlock.class);
/** /**
@ -66,6 +67,7 @@ public class RawDataBlock
throws IOException { throws IOException {
_data = new byte[ blockSize ]; _data = new byte[ blockSize ];
int count = IOUtils.readFully(stream, _data); int count = IOUtils.readFully(stream, _data);
_hasData = (count > 0);
if (count == -1) { if (count == -1) {
_eof = true; _eof = true;
@ -94,16 +96,21 @@ public class RawDataBlock
/** /**
* When we read the data, did we hit end of file? * When we read the data, did we hit end of file?
* *
* @return true if no data was read because we were at the end of * @return true if the EoF was hit during this block, or
* the file, else false * false if not. If you have a dodgy short last block, then
* * it's possible to both have data, and also hit EoF...
* @exception IOException
*/ */
public boolean eof() public boolean eof() {
throws IOException
{
return _eof; return _eof;
} }
/**
* Did we actually find any data to read? It's possible,
* in the event of a short last block, to both have hit
* the EoF, but also to have data
*/
public boolean hasData() {
return _hasData;
}
/* ********** START implementation of ListManagedBlock ********** */ /* ********** START implementation of ListManagedBlock ********** */
@ -117,7 +124,7 @@ public class RawDataBlock
public byte [] getData() public byte [] getData()
throws IOException throws IOException
{ {
if (eof()) if (! hasData())
{ {
throw new IOException("Cannot return empty data"); throw new IOException("Cannot return empty data");
} }

View File

@ -51,12 +51,16 @@ public class RawDataBlockList
while (true) while (true)
{ {
RawDataBlock block = new RawDataBlock(stream, bigBlockSize); RawDataBlock block = new RawDataBlock(stream, bigBlockSize);
// If there was data, add the block to the list
if(block.hasData()) {
blocks.add(block);
}
if (block.eof()) // If the stream is now at the End Of File, we're done
{ if (block.eof()) {
break; break;
} }
blocks.add(block);
} }
setBlocks(( RawDataBlock [] ) blocks.toArray(new RawDataBlock[ 0 ])); setBlocks(( RawDataBlock [] ) blocks.toArray(new RawDataBlock[ 0 ]));
} }

View File

@ -130,7 +130,7 @@ public final class TestPOIFSFileSystem extends TestCase {
* The other is to fix the handling of the last block in * The other is to fix the handling of the last block in
* POIFS, since it seems to be slight wrong * POIFS, since it seems to be slight wrong
*/ */
public void DISABLEDtestShortLastBlock() throws Exception { public void testShortLastBlock() throws Exception {
String[] files = new String[] { String[] files = new String[] {
"ShortLastBlock.qwp", "ShortLastBlock.wps" "ShortLastBlock.qwp", "ShortLastBlock.wps"
}; };