diff options
author | Nick Burch <nick@apache.org> | 2011-09-19 11:43:09 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2011-09-19 11:43:09 +0000 |
commit | 29f7fe9eb241bc45295acc07322949c46d7817ee (patch) | |
tree | d53d0f5fdbb72444167f2c217657a9cd096549f1 | |
parent | e1deb2c1970f7e0f95eef4f9464f59c36eaa848e (diff) | |
download | poi-29f7fe9eb241bc45295acc07322949c46d7817ee.tar.gz poi-29f7fe9eb241bc45295acc07322949c46d7817ee.zip |
Fix bug #51832 - handle XLS files where the WRITEPROTECT record preceeds the FILEPASS one, rather than following as normal
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1172575 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 1 | ||||
-rw-r--r-- | src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java | 15 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java | 14 | ||||
-rw-r--r-- | test-data/spreadsheet/51832.xls | bin | 0 -> 57344 bytes |
4 files changed, 30 insertions, 0 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index be005a1d78..69291355a9 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ <changes> <release version="3.8-beta5" date="2011-??-??"> + <action dev="poi-developers" type="fix">51832 - handle XLS files where the WRITEPROTECT record preceeds the FILEPASS one, rather than following as normal</action> <action dev="poi-developers" type="fix">51809 - correct GTE handling in COUNTIF</action> <action dev="poi-developers" type="add">Add HWPF API to update range text and delete bookmarks</action> <action dev="poi-developers" type="add">HWPF Bookmarks tables are correctly updated on text updates</action> diff --git a/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java b/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java index 479169a5c2..344ad07ef3 100644 --- a/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java +++ b/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java @@ -57,11 +57,26 @@ public final class RecordFactoryInputStream { FilePassRecord fpr = null; if (rec instanceof BOFRecord) { _hasBOFRecord = true; + + // Fetch the next record, and see if it indicates whether + // the document is encrypted or not if (rs.hasNextRecord()) { rs.nextRecord(); rec = RecordFactory.createSingleRecord(rs); recSize += rec.getRecordSize(); outputRecs.add(rec); + + // Encrypted is normally BOF then FILEPASS + // May sometimes be BOF, WRITEPROTECT, FILEPASS + if (rec instanceof WriteProtectRecord && rs.hasNextRecord()) { + rs.nextRecord(); + rec = RecordFactory.createSingleRecord(rs); + recSize += rec.getRecordSize(); + outputRecs.add(rec); + } + + // If it's a FILEPASS, track it specifically but + // don't include it in the main stream if (rec instanceof FilePassRecord) { fpr = (FilePassRecord) rec; outputRecs.remove(outputRecs.size()-1); diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index e64cd7240b..12171ccb0c 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -18,6 +18,8 @@ package org.apache.poi.hssf.usermodel; import junit.framework.AssertionFailedError; + +import org.apache.poi.EncryptedDocumentException; import org.apache.poi.hssf.HSSFITestDataProvider; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.OldExcelFormatException; @@ -2179,4 +2181,16 @@ if(1==2) { writeOutAndReadBack(wb); } + /** + * Normally encrypted files have BOF then FILEPASS, but + * some may squeeze a WRITEPROTECT in the middle + */ + public void test51832() { + try { + openSample("51832.xls"); + fail("Encrypted file"); + } catch(EncryptedDocumentException e) { + // Good + } + } } diff --git a/test-data/spreadsheet/51832.xls b/test-data/spreadsheet/51832.xls Binary files differnew file mode 100644 index 0000000000..8b38bffe8b --- /dev/null +++ b/test-data/spreadsheet/51832.xls |