mirror of https://github.com/apache/poi.git
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:
parent
6b19217c3d
commit
8536301aab
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ]));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue