summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-04-22 18:05:53 -0400
committerFridrich Strba <fridrich@documentfoundation.org>2013-04-24 08:28:19 +0000
commit30d6b1d13da9808eb4544d4bffb0acc49c0e6c5c (patch)
tree7c15e1e25c674fbb26e7f84a26f2208e57ae568d
parentade0bd686190aa7016c2d0e1dab231cb15365fde (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.mk1
-rw-r--r--sc/source/filter/orcus/xmlcontext.cxx34
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;