summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2021-09-27 17:05:25 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2021-09-28 05:54:40 +0200
commite753de4630fb74ac837d0339be23a305f18d0725 (patch)
treeafa7beca23ef6829734eacf862c14d8313b11a4b /sc
parentb60b6bfaafa1315e07108dba50f016975b619c59 (diff)
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.kaganski@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/data/xls/tdf144732.xlsbin0 -> 266 bytes
-rw-r--r--sc/qa/unit/subsequent_filters_test2.cxx103
-rw-r--r--sc/source/filter/excel/impop.cxx6
3 files changed, 105 insertions, 4 deletions
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
--- /dev/null
+++ b/sc/qa/unit/data/xls/tdf144732.xls
Binary files differ
diff --git a/sc/qa/unit/subsequent_filters_test2.cxx b/sc/qa/unit/subsequent_filters_test2.cxx
index bf0dee63d885..4803e19cbab8 100644
--- a/sc/qa/unit/subsequent_filters_test2.cxx
+++ b/sc/qa/unit/subsequent_filters_test2.cxx
@@ -207,6 +207,7 @@ public:
void testTdf129940();
void testTdf139763ShapeAnchor();
void testAutofilterNamedRangesXLSX();
+ void testInvalidBareBiff5();
CPPUNIT_TEST_SUITE(ScFiltersTest2);
@@ -313,6 +314,7 @@ public:
CPPUNIT_TEST(testTdf129940);
CPPUNIT_TEST(testTdf139763ShapeAnchor);
CPPUNIT_TEST(testAutofilterNamedRangesXLSX);
+ CPPUNIT_TEST(testInvalidBareBiff5);
CPPUNIT_TEST_SUITE_END();
@@ -2895,6 +2897,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 6ecde0fbdd4b..2a2346d81ea3 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -1205,12 +1205,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) )