diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-09-11 17:58:13 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-09-11 17:58:13 +0200 |
commit | cd8aeed1569222edd8bfd05d9d833f74b679fcd0 (patch) | |
tree | a0b21dc5f77625ac4b4395f355a53799cd0bf07d /filter/source | |
parent | Avoid "ThreadSanitizer: lock-order-inversion (potential deadlock)" (diff) | |
download | core-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.cxx | 21 | ||||
-rw-r--r-- | filter/source/xsltfilter/LibXSLTTransformer.hxx | 3 |
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, ¶ms[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; |