You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2015/02/13 20:14:14 UTC

svn commit: r1659650 - in /poi/trunk: src/java/org/apache/poi/hssf/record/SSTRecord.java src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java test-data/spreadsheet/57456.xls

Author: centic
Date: Fri Feb 13 19:14:14 2015
New Revision: 1659650

URL: http://svn.apache.org/r1659650
Log:
Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number in unique-strings-count-field

Added:
    poi/trunk/test-data/spreadsheet/57456.xls
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java Fri Feb 13 19:14:14 2015
@@ -243,7 +243,14 @@ public final class SSTRecord extends Con
         field_1_num_strings = in.readInt();
         field_2_num_unique_strings = in.readInt();
         field_3_strings = new IntMapper<UnicodeString>();
+        
         deserializer = new SSTDeserializer(field_3_strings);
+        // Bug 57456: some Excel Sheets send 0 as field=1, but have some random number in field_2,
+        // we should not try to read the strings in this case.
+        if(field_1_num_strings == 0) {
+            field_2_num_unique_strings = 0;
+            return;
+        }
         deserializer.manufactureStrings( field_2_num_unique_strings, in );
     }
 

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java Fri Feb 13 19:14:14 2015
@@ -47,26 +47,24 @@ public final class TestSSTRecord extends
     /**
      * decodes hexdump files and concatenates the results
      * @param hexDumpFileNames names of sample files in the hssf test data directory
+     * @throws IOException 
      */
-    private static byte[] concatHexDumps(String... hexDumpFileNames) {
+    private static byte[] concatHexDumps(String... hexDumpFileNames) throws IOException {
         int nFiles = hexDumpFileNames.length;
         ByteArrayOutputStream baos = new ByteArrayOutputStream(nFiles * 8228);
         for (int i = 0; i < nFiles; i++) {
             String sampleFileName = hexDumpFileNames[i];
             InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
             BufferedReader br = new BufferedReader(new InputStreamReader(is));
-            try {
-                while (true) {
-                    String line = br.readLine();
-                    if (line == null) {
-                        break;
-                    }
-                    baos.write(HexRead.readFromString(line));
+
+            while (true) {
+                String line = br.readLine();
+                if (line == null) {
+                    break;
                 }
-                is.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+                baos.write(HexRead.readFromString(line));
             }
+            is.close();
         }
 
         return baos.toByteArray();
@@ -86,8 +84,9 @@ public final class TestSSTRecord extends
 
     /**
      * SST is often split over several {@link ContinueRecord}s
+     * @throws IOException 
      */
-    public void testContinuedRecord() {
+    public void testContinuedRecord() throws IOException {
         byte[] origData;
         SSTRecord record;
         byte[] ser_output;
@@ -288,11 +287,10 @@ public final class TestSSTRecord extends
         assertEquals( 2, record.countStrings() );
         assertEquals( 3, record.getNumStrings() );
         assertEquals( 2, record.getNumUniqueStrings() );
-        Iterator iter = record.getStrings();
+        Iterator<UnicodeString> iter = record.getStrings();
 
-        while ( iter.hasNext() )
-        {
-            UnicodeString ucs = (UnicodeString) iter.next();
+        while ( iter.hasNext() ) {
+            UnicodeString ucs = iter.next();
 
             if ( ucs.equals( s1 ) )
             {
@@ -1498,4 +1496,13 @@ public final class TestSSTRecord extends
         assertEquals(src, dst);
     }
 
+    public void test57456() {
+        byte[] bytes = HexRead.readFromString("FC, 00, 08, 00, 00, 00, 00, 00, E1, 06, 00, 00");
+        RecordInputStream in = TestcaseRecordInputStream.create(bytes);
+        assertEquals(SSTRecord.sid, in.getSid());
+        SSTRecord src = new SSTRecord(in);
+        assertEquals(0, src.getNumStrings());
+        assertEquals(0, src.getNumUniqueStrings());
+        
+    }
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Fri Feb 13 19:14:14 2015
@@ -2681,4 +2681,10 @@ public final class TestBugs extends Base
         s = wb.getSheetAt(0);
         assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula());
     }
+
+    @Test
+    public void test57456() throws IOException {
+        Workbook wb = openSample("57456.xls");
+        wb.close();
+    }
 }

Added: poi/trunk/test-data/spreadsheet/57456.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/57456.xls?rev=1659650&view=auto
==============================================================================
Binary files poi/trunk/test-data/spreadsheet/57456.xls (added) and poi/trunk/test-data/spreadsheet/57456.xls Fri Feb 13 19:14:14 2015 differ



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org