mirror of https://github.com/apache/poi.git
fixed InterfaceEndRecord to tolerate unexpected record contents, see bug 47251
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@892862 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cba00b6d1d
commit
95642c0bfd
|
@ -34,6 +34,7 @@
|
|||
|
||||
<changes>
|
||||
<release version="3.7-SNAPSHOT" date="2010-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="fix">47215 - fixed InterfaceEndRecord to tolerate unexpected record contents </action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">48415 - improved javadoc on HSSPicture.resize() </action>
|
||||
<action dev="POI-DEVELOPERS" type="add">added Ant target to install artifacts in local repository </action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">48026 - fixed PageSettingsBlock to allow multiple HeaderFooterRecord records </action>
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
package org.apache.poi.hssf.record;
|
||||
|
||||
import org.apache.poi.util.LittleEndianOutput;
|
||||
import org.apache.poi.util.HexDump;
|
||||
import org.apache.poi.util.POILogger;
|
||||
import org.apache.poi.util.POILogFactory;
|
||||
|
||||
/**
|
||||
* Title: Interface End Record (0x00E2)<P>
|
||||
|
@ -28,17 +31,23 @@ import org.apache.poi.util.LittleEndianOutput;
|
|||
* @version 2.0-pre
|
||||
*/
|
||||
public final class InterfaceEndRecord extends StandardRecord {
|
||||
private static POILogger logger = POILogFactory.getLogger(InterfaceEndRecord.class);
|
||||
|
||||
public final static short sid = 0x00E2;
|
||||
|
||||
private byte[] _unknownData;
|
||||
|
||||
public InterfaceEndRecord()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @param in unused (since this record has no data)
|
||||
*/
|
||||
public InterfaceEndRecord(RecordInputStream in)
|
||||
{
|
||||
if(in.available() > 0){
|
||||
_unknownData = in.readRemainder();
|
||||
logger.log(POILogger.WARN, "encountered unexpected " +
|
||||
_unknownData.length + " bytes in InterfaceEndRecord");
|
||||
}
|
||||
}
|
||||
|
||||
public String toString()
|
||||
|
@ -46,15 +55,19 @@ public final class InterfaceEndRecord extends StandardRecord {
|
|||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
buffer.append("[INTERFACEEND]\n");
|
||||
buffer.append(" unknownData=").append(HexDump.toHex(_unknownData)).append("\n");
|
||||
buffer.append("[/INTERFACEEND]\n");
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
public void serialize(LittleEndianOutput out) {
|
||||
if(_unknownData != null) out.write(_unknownData);
|
||||
}
|
||||
|
||||
protected int getDataSize() {
|
||||
return 0;
|
||||
int size = 0;
|
||||
if(_unknownData != null) size += _unknownData.length;
|
||||
return size;
|
||||
}
|
||||
|
||||
public short getSid()
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
package org.apache.poi.hssf.record;
|
||||
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.poi.util.HexRead;
|
||||
import org.apache.poi.util.HexDump;
|
||||
import java.util.List;
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
/**
|
||||
* Tests the serialization and deserialization of the EndSubRecord
|
||||
* class works correctly. Test data taken directly from a real
|
||||
* Excel file.
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public final class TestInterfaceEndRecord extends TestCase {
|
||||
|
||||
public void testCreate() {
|
||||
InterfaceEndRecord record = new InterfaceEndRecord();
|
||||
assertEquals(0, record.getDataSize());
|
||||
}
|
||||
|
||||
/**
|
||||
* Silently swallow unexpected contents in InterfaceEndRecord.
|
||||
* Although it violates the spec, Excel silently reads such files.
|
||||
*/
|
||||
public void testUnexpectedBytes_bug47251(){
|
||||
String hex = "" +
|
||||
"09 08 10 00 00 06 05 00 EC 15 CD 07 C1 C0 00 00 06 03 00 00 " + //BOF
|
||||
"E2 00 02 00 B0 04 " + //INTERFACEEND with extra two bytes
|
||||
"0A 00 00 00"; // EOF
|
||||
byte[] data = HexRead.readFromString(hex);
|
||||
List<Record> records = RecordFactory.createRecords(new ByteArrayInputStream(data));
|
||||
assertEquals(3, records.size());
|
||||
InterfaceEndRecord r = (InterfaceEndRecord)records.get(1);
|
||||
assertEquals("[E2, 00, 02, 00, B0, 04]", HexDump.toHex(r.serialize()));
|
||||
}
|
||||
}
|
|
@ -1533,4 +1533,8 @@ public final class TestBugs extends BaseTestBugzillaIssues {
|
|||
public void test48026() {
|
||||
openSample("48026.xls");
|
||||
}
|
||||
|
||||
public void test47251() {
|
||||
openSample("47251.xls");
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue