Bug 61287

Summary: HeaderRecord or FooterRecord throws RecordFormatException when the text of length 0
Product: POI Reporter: lejingw <lejingw>
Component: HSSFAssignee: POI Developers List <dev>
Status: RESOLVED FIXED    
Severity: critical    
Priority: P2    
Version: 3.16-FINAL   
Target Milestone: ---   
Hardware: PC   
OS: Mac OS X 10.1   
Attachments: the excel to be read with exception
pach file to be validated
the excel to be read with exception

Description lejingw 2017-07-13 02:40:31 UTC
in the construtor method of `org.apache.poi.hssf.record.HeaderFooterBase#HeaderFooterBase(org.apache.poi.hssf.record.RecordInputStream)`, it will throw RecordFormatException in the method call `in.readByte()` when variable field_1_footer_len equals to 0 

the constrator is as follows:

	protected HeaderFooterBase(RecordInputStream in) {
		if (in.remaining() > 0) {
			int field_1_footer_len = in.readShort();
			field_2_hasMultibyte = in.readByte() != 0x00;

			if (field_2_hasMultibyte) {
				field_3_text = in.readUnicodeLEString(field_1_footer_len);
			} else {
				field_3_text = in.readCompressedUnicode(field_1_footer_len);
			}
		} else {
			// Note - this is unusual for BIFF records in general, but normal for header / footer records:
			// when the text is empty string, the whole record is empty (just the 4 byte BIFF header)
			field_3_text = "";
		}
	}

and the exception stack is as follows:

org.apache.poi.hssf.record.RecordFormatException: Not enough data (0) to read requested (1) bytes
	at org.apache.poi.hssf.record.RecordInputStream.checkRecordPosition(RecordInputStream.java:237)
	at org.apache.poi.hssf.record.RecordInputStream.readByte(RecordInputStream.java:246)
	at org.apache.poi.hssf.record.HeaderFooterBase.<init>(HeaderFooterBase.java:39)
	at org.apache.poi.hssf.record.HeaderRecord.<init>(HeaderRecord.java:36)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.poi.hssf.record.RecordFactory$ReflectionConstructorRecordCreator.create(RecordFactory.java:84)
	at org.apache.poi.hssf.record.RecordFactory.createSingleRecord(RecordFactory.java:345)
	at org.apache.poi.hssf.record.RecordFactoryInputStream.readNextRecord(RecordFactoryInputStream.java:288)
	at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:254)
	at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:494)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:348)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:405)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:386)
Comment 1 lejingw 2017-07-13 02:42:50 UTC
Created attachment 35125 [details]
the excel to be read with exception
Comment 2 Tim Allison 2017-07-13 17:01:21 UTC
Thank you for opening this issue and sharing a triggering document.  I'm not able to reproduce this with trunk.  Are you using 3.17-beta1 or an earlier version of POI?
Comment 3 Tim Allison 2017-07-13 17:02:31 UTC
(In reply to Tim Allison from comment #2)
> Thank you for opening this issue and sharing a triggering document.  I'm not
> able to reproduce this with trunk.  Are you using 3.17-beta1 or an earlier
> version of POI?

Doh.  Right, you selected 3.16-final above.  This looks to be fixed now.  Please reopen if you are having problems with 3.17-beta1.
Comment 4 lejingw 2017-07-14 01:24:48 UTC
Created attachment 35136 [details]
pach file to be validated

i have updated the attachment, the exception still exists in 3.17-beta1.
Comment 5 lejingw 2017-07-14 01:26:07 UTC
Created attachment 35137 [details]
the excel to be read with exception
Comment 6 Tim Allison 2017-07-14 13:54:46 UTC
Thank you for reporting this, diagnosing the problem and sharing triggering files!