diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-22 18:05:53 -0400 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-04-24 08:28:19 +0000 |
commit | 30d6b1d13da9808eb4544d4bffb0acc49c0e6c5c (patch) | |
tree | 7c15e1e25c674fbb26e7f84a26f2208e57ae568d | |
parent | ade0bd686190aa7016c2d0e1dab231cb15365fde (diff) |
fdo#61820: Avoid crasher when file URL contains unicode bytes.
This is a cherry-pick of 6374df20c2a8378209cce21c0e9689e65b8bd9a2.
Credit goes to Isamu Mogi for pin-pointing exactly what caused the crash
and which commit fixed it on master.
Change-Id: Ic5653c76c8c7d8eb8798a9c4ae0cbc43f0e946e4
Reviewed-on: https://gerrit.libreoffice.org/3581
Reviewed-by: Eike Rathke <erack@redhat.com>
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r-- | sc/Library_scfilt.mk | 1 | ||||
-rw-r--r-- | sc/source/filter/orcus/xmlcontext.cxx | 34 |
2 files changed, 30 insertions, 5 deletions
diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk index bdb99caccb1d..0a849da6001c 100644 --- a/sc/Library_scfilt.mk +++ b/sc/Library_scfilt.mk @@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,scfilt,\ svxcore \ tk \ tl \ + ucbhelper \ utl \ vcl \ i18nisolang1 \ diff --git a/sc/source/filter/orcus/xmlcontext.cxx b/sc/source/filter/orcus/xmlcontext.cxx index ecbf35bf9691..001c8f93eaec 100644 --- a/sc/source/filter/orcus/xmlcontext.cxx +++ b/sc/source/filter/orcus/xmlcontext.cxx @@ -14,6 +14,7 @@ #include "svtools/treelistbox.hxx" #include "svtools/treelistentry.hxx" +#include "ucbhelper/content.hxx" #include <orcus/spreadsheet/import_interface.hpp> #include <orcus/xml_structure_tree.hpp> @@ -21,7 +22,14 @@ #include <orcus/orcus_xml.hpp> #include <orcus/global.hpp> +#include <com/sun/star/ucb/XCommandEnvironment.hpp> + #include <string> +#include <sstream> + +#define BUFFER_SIZE 4096 + +using namespace com::sun::star; namespace { @@ -143,6 +151,26 @@ public: } }; +void loadContentFromURL(const OUString& rURL, std::string& rStrm) +{ + ucbhelper::Content aContent( + rURL, uno::Reference<ucb::XCommandEnvironment>(), comphelper::getProcessComponentContext()); + uno::Reference<io::XInputStream> xStrm = aContent.openStream(); + + std::ostringstream aStrmBuf; + uno::Sequence<sal_Int8> aBytes; + size_t nBytesRead = 0; + do + { + nBytesRead = xStrm->readBytes(aBytes, BUFFER_SIZE); + const sal_Int8* p = aBytes.getConstArray(); + aStrmBuf << std::string(p, p + nBytesRead); + } + while (nBytesRead == BUFFER_SIZE); + + rStrm = aStrmBuf.str(); +} + } ScOrcusXMLContextImpl::ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& rPath) : @@ -154,12 +182,8 @@ bool ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM { rParam.maUserDataStore.clear(); - OString aSysPath = ScOrcusFiltersImpl::toSystemPath(maPath); - const char* path = aSysPath.getStr(); - - // TODO: Use our own stream loading call instead of one from orcus. std::string aStrm; - orcus::load_file_content(path, aStrm); + loadContentFromURL(maPath, aStrm); if (aStrm.empty()) return false; |