Kaydet (Commit) 5d6f6aa1 authored tarafından Kohei Yoshida's avatar Kohei Yoshida Kaydeden (comit) Petr Mladek

fdo#61820: Avoid crasher when file URL contains unicode bytes.

This is a cherry-pick of 6374df20.

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/3581Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Reviewed-by: 's avatarFridrich Strba <fridrich@documentfoundation.org>
Tested-by: 's avatarFridrich Strba <fridrich@documentfoundation.org>
üst 86da39ec
......@@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,scfilt,\
svxcore \
tk \
tl \
ucbhelper \
utl \
vcl \
i18nisolang1 \
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment