diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-09 16:14:40 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-13 01:54:35 -0400 |
commit | 44358ce0b0c2ee5de981fdce66849b3f3ac32390 (patch) | |
tree | 606c1bd595df8ff711d8f1471aba07a785da80b5 /sc | |
parent | 0552a09b95010d0f622688c2508a0684803a3fa5 (diff) |
Try not to crash during import of xlsx and ods documents.
Also, let's not leak memory by returning a new'ed instance from get_styles().
Orcus never manages the life cycle of objects returned from client code.
Change-Id: Id92eb10dbe88c2a55b5d04e408a01fa9c25fa9a1
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/filter/inc/orcusinterface.hxx | 31 | ||||
-rw-r--r-- | sc/source/filter/orcus/interface.cxx | 4 |
2 files changed, 18 insertions, 17 deletions
diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 4bc9b408aa71..0de1fcc29b35 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -42,21 +42,6 @@ public: const OUString& getByIndex(size_t index) const; }; -class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory -{ - ScDocument& mrDoc; - boost::ptr_vector<ScOrcusSheet> maSheets; - ScOrcusSharedStrings maSharedStrings; - -public: - ScOrcusFactory(ScDocument& rDoc); - - virtual orcus::spreadsheet::iface::import_sheet* append_sheet(const char *sheet_name, size_t sheet_name_length); - virtual orcus::spreadsheet::iface::import_sheet* get_sheet(const char *sheet_name, size_t sheet_name_length); - virtual orcus::spreadsheet::iface::import_shared_strings* get_shared_strings(); - virtual orcus::spreadsheet::iface::import_styles* get_styles(); -}; - class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet { ScDocument& mrDoc; @@ -165,5 +150,21 @@ public: virtual size_t commit_cell_style(); }; +class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory +{ + ScDocument& mrDoc; + boost::ptr_vector<ScOrcusSheet> maSheets; + ScOrcusSharedStrings maSharedStrings; + ScOrcusStyles maStyles; + +public: + ScOrcusFactory(ScDocument& rDoc); + + virtual orcus::spreadsheet::iface::import_sheet* append_sheet(const char *sheet_name, size_t sheet_name_length); + virtual orcus::spreadsheet::iface::import_sheet* get_sheet(const char *sheet_name, size_t sheet_name_length); + virtual orcus::spreadsheet::iface::import_shared_strings* get_shared_strings(); + virtual orcus::spreadsheet::iface::import_styles* get_styles(); +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index 25d9b5d21224..5e48208ac2d8 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -73,7 +73,7 @@ orcus::spreadsheet::iface::import_shared_strings* ScOrcusFactory::get_shared_str orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles() { // We don't support it yet. - return new ScOrcusStyles; + return &maStyles; } ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) : @@ -239,7 +239,7 @@ const OUString& ScOrcusSharedStrings::getByIndex(size_t nIndex) const if(nIndex < maSharedStrings.size()) return maSharedStrings[nIndex]; - throw std::exception(); + return EMPTY_OUSTRING; } void ScOrcusSharedStrings::set_segment_bold(bool /*b*/) |