From 2cd1847dd49d90985b2641865b49c9ed2ceb5bcd Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 19 Sep 2011 11:43:09 +0000 Subject: [PATCH] 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 --- src/documentation/content/xdocs/status.xml | 1 + .../hssf/record/RecordFactoryInputStream.java | 15 +++++++++++++++ .../org/apache/poi/hssf/usermodel/TestBugs.java | 14 ++++++++++++++ test-data/spreadsheet/51832.xls | Bin 0 -> 57344 bytes 4 files changed, 30 insertions(+) create mode 100644 test-data/spreadsheet/51832.xls diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index be005a1d7..69291355a 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 51832 - handle XLS files where the WRITEPROTECT record preceeds the FILEPASS one, rather than following as normal 51809 - correct GTE handling in COUNTIF Add HWPF API to update range text and delete bookmarks HWPF Bookmarks tables are correctly updated on text updates diff --git a/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java b/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java index 479169a5c..344ad07ef 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 e64cd7240..12171ccb0 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 new file mode 100644 index 0000000000000000000000000000000000000000..8b38bffe8b7b9ffe794e67a90e426fbad6e9130f GIT binary patch literal 57344 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 byJLPRFncE^GpBdaVe{!z|0?$1KW_g&llP=K literal 0 HcmV?d00001