sc/qa/unit/data/xls/tdf144732.xls       |binary
 sc/qa/unit/subsequent_filters-test2.cxx |  103 ++++++++++++++++++++++++++++++++
 sc/source/filter/excel/impop.cxx        |    6 -
 3 files changed, 105 insertions(+), 4 deletions(-)

New commits:
commit a3010249f185b8d2b7ade2cbf10600255bb935fb
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Sep 27 17:05:25 2021 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Tue Sep 28 14:12:53 2021 +0200

    tdf#144732: treat invalid subtype value as worksheet
    
    Commit 9bdb1d2473510067da1ac74013595b661ac37800 for
    i51490 had introduced the same change for Bof2, Bof3, Bof4.
    
    Change-Id: I478a8611874d70fad0c83700efed5ea882d5f69f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122650
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122758
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sc/qa/unit/data/xls/tdf144732.xls 
b/sc/qa/unit/data/xls/tdf144732.xls
new file mode 100644
index 000000000000..04f3cc0d12bf
Binary files /dev/null and b/sc/qa/unit/data/xls/tdf144732.xls differ
diff --git a/sc/qa/unit/subsequent_filters-test2.cxx 
b/sc/qa/unit/subsequent_filters-test2.cxx
index 4b4995f9147c..9c15eebfff0a 100644
--- a/sc/qa/unit/subsequent_filters-test2.cxx
+++ b/sc/qa/unit/subsequent_filters-test2.cxx
@@ -206,6 +206,7 @@ public:
     void testTdf129940();
     void testTdf139763ShapeAnchor();
     void testAutofilterNamedRangesXLSX();
+    void testInvalidBareBiff5();
 
     CPPUNIT_TEST_SUITE(ScFiltersTest2);
 
@@ -311,6 +312,7 @@ public:
     CPPUNIT_TEST(testTdf129940);
     CPPUNIT_TEST(testTdf139763ShapeAnchor);
     CPPUNIT_TEST(testAutofilterNamedRangesXLSX);
+    CPPUNIT_TEST(testInvalidBareBiff5);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -2875,6 +2877,107 @@ void ScFiltersTest2::testAutofilterNamedRangesXLSX()
     xDocSh->DoClose();
 }
 
+void ScFiltersTest2::testInvalidBareBiff5()
+{
+    ScDocShellRef xDocSh = loadDoc(u"tdf144732.", FORMAT_XLS);
+    CPPUNIT_ASSERT(xDocSh.is());
+    ScDocument& rDoc = xDocSh->GetDocument();
+    rDoc.CalcAll();
+
+    // Check that we import the contents from such file, as Excel does
+    CPPUNIT_ASSERT_EQUAL(SCTAB(1), rDoc.GetTableCount());
+
+    // Row 1
+    ScAddress aPos(0, 0, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(1.0, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(2.0, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(3.0, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+
+    // Row 2
+    aPos = ScAddress(0, 1, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, rDoc.GetCellType(aPos));
+    OUString sFormula;
+    rDoc.GetFormula(aPos.Col(), aPos.Row(), aPos.Tab(), sFormula);
+    CPPUNIT_ASSERT_EQUAL(OUString("=TRUE()"), sFormula);
+    CPPUNIT_ASSERT_EQUAL(1.0, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, rDoc.GetCellType(aPos));
+    rDoc.GetFormula(aPos.Col(), aPos.Row(), aPos.Tab(), sFormula);
+    CPPUNIT_ASSERT_EQUAL(OUString("=FALSE()"), sFormula);
+    CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"sheetjs"), rDoc.GetString(aPos));
+
+    // Row 3
+    aPos = ScAddress(0, 2, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"foo    bar"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"baz"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(41689.4375, rDoc.GetValue(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"0.3"), rDoc.GetString(aPos));
+
+    // Row 4
+    aPos = ScAddress(0, 3, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"baz"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"_"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(3.14159, rDoc.GetValue(aPos));
+
+    // Row 5
+    aPos = ScAddress(0, 4, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"hidden"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+
+    // Row 6
+    aPos = ScAddress(0, 5, 0);
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(u"visible"), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+    aPos.IncCol();
+    CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos));
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos));
+
+    xDocSh->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(ScFiltersTest2);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index 988ec3fbf65e..bc3571973fc5 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -1209,12 +1209,10 @@ void ImportExcel::Bof5()
     {
         case 0x0005:    eDatei = Biff5W;    break;  // workbook globals
         case 0x0006:    eDatei = Biff5V;    break;  // VB module
-        case 0x0010:    eDatei = Biff5;     break;  // worksheet
         case 0x0020:    eDatei = Biff5C;    break;  // chart
         case 0x0040:    eDatei = Biff5M4;   break;  // macro sheet
-        default:
-            pExcRoot->eDateiTyp = BiffX;
-            return;
+        case 0x0010:                                // worksheet
+        default:        eDatei = Biff5;     break;  // tdf#144732 Excel 
interprets invalid indexes as worksheet
     }
 
     if( nVers == 0x0600 && (GetBiff() == EXC_BIFF8) )

Reply via email to