summaryrefslogtreecommitdiffstats
path: root/filter/source
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-09-11 17:58:13 +0200
committerStephan Bergmann <sbergman@redhat.com>2017-09-11 17:58:13 +0200
commitcd8aeed1569222edd8bfd05d9d833f74b679fcd0 (patch)
treea0b21dc5f77625ac4b4395f355a53799cd0bf07d /filter/source
parentAvoid "ThreadSanitizer: lock-order-inversion (potential deadlock)" (diff)
downloadcore-cd8aeed1569222edd8bfd05d9d833f74b679fcd0.tar.gz
core-cd8aeed1569222edd8bfd05d9d833f74b679fcd0.zip
Fix data races during CppunitTest_filter_xslt
Change-Id: I140ac8a24326959ba341adddbbf505ff16616283
Diffstat (limited to 'filter/source')
-rw-r--r--filter/source/xsltfilter/LibXSLTTransformer.cxx21
-rw-r--r--filter/source/xsltfilter/LibXSLTTransformer.hxx3
2 files changed, 20 insertions, 4 deletions
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx
index 33719eb5e4c6..35d3dfcc8242 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.cxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx
@@ -298,7 +298,12 @@ namespace XSLT
std::unique_ptr<OleHandler> oh(new OleHandler(m_transformer->getComponentContext()));
if (styleSheet)
{
- m_tcontext = xsltNewTransformContext(styleSheet, doc);
+ xsltTransformContextPtr tcontext = xsltNewTransformContext(
+ styleSheet, doc);
+ {
+ std::unique_lock<std::mutex> g(m_mutex);
+ m_tcontext = tcontext;
+ }
oh->registercontext(m_tcontext);
xsltQuoteUserParams(m_tcontext, &params[0]);
result = xsltApplyStylesheetUser(styleSheet, doc, nullptr, nullptr, nullptr,
@@ -331,7 +336,10 @@ namespace XSLT
oh.reset();
xsltFreeStylesheet(styleSheet);
xsltFreeTransformContext(m_tcontext);
- m_tcontext = nullptr;
+ {
+ std::unique_lock<std::mutex> g(m_mutex);
+ m_tcontext = nullptr;
+ }
xmlFreeDoc(doc);
xmlFreeDoc(result);
}
@@ -354,12 +362,17 @@ namespace XSLT
void Reader::forceStateStopped()
{
- if (!m_tcontext)
+ xsltTransformContextPtr tcontext;
+ {
+ std::unique_lock<std::mutex> g(m_mutex);
+ tcontext = m_tcontext;
+ }
+ if (!tcontext)
return;
//tdf#100057 If we force a cancel, libxslt will of course just keep on going unless something
//tells it to stop. Here we force the stopped state so that libxslt will stop processing
//and so Reader::execute will complete and we can join cleanly
- m_tcontext->state = XSLT_STATE_STOPPED;
+ tcontext->state = XSLT_STATE_STOPPED;
}
Reader::~Reader()
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.hxx b/filter/source/xsltfilter/LibXSLTTransformer.hxx
index beb500f7faa5..e65820b1fd99 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.hxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.hxx
@@ -12,6 +12,7 @@
#include <list>
#include <map>
+#include <mutex>
#include <libxml/parser.h>
#include <libxml/tree.h>
@@ -71,6 +72,8 @@ namespace XSLT
LibXSLTTransformer* m_transformer;
Sequence<sal_Int8> m_readBuf;
Sequence<sal_Int8> m_writeBuf;
+
+ std::mutex m_mutex;
xsltTransformContextPtr m_tcontext;
virtual void execute() override;