diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-06-05 11:45:36 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-06-05 11:46:47 +0100 |
commit | 05661623c7e328c536814354bafd8294de0e9ee0 (patch) | |
tree | 2a3418903402afcf1b15bb0bb55671806fec70ba /package | |
parent | 1af10d4012aa84a26568bac42bb47a267342afd5 (diff) |
uncaught exceptions in parallel deflate threads on re-export of HTB23106 odgs
Change-Id: Ib6aef478b8dcf1c7a7262ab60eef4d44da0de632
Diffstat (limited to 'package')
-rw-r--r-- | package/inc/ZipOutputEntry.hxx | 4 | ||||
-rw-r--r-- | package/source/zipapi/ZipOutputStream.cxx | 6 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageStream.cxx | 12 |
3 files changed, 20 insertions, 2 deletions
diff --git a/package/inc/ZipOutputEntry.hxx b/package/inc/ZipOutputEntry.hxx index 48e33ebb546f..2a5aa0483ce8 100644 --- a/package/inc/ZipOutputEntry.hxx +++ b/package/inc/ZipOutputEntry.hxx @@ -42,6 +42,7 @@ class ZipOutputEntry ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XCipherContext > m_xCipherContext; ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XDigestContext > m_xDigestContext; + ::css::uno::Any m_aParallelDeflateException; CRC32 m_aCRC; ZipEntry *m_pCurrentEntry; @@ -62,6 +63,9 @@ public: ZipPackageStream* getZipPackageStream() { return m_pCurrentStream; } bool isEncrypt() { return m_bEncryptCurrentEntry; } + void setParallelDeflateException(const ::css::uno::Any &rAny) { m_aParallelDeflateException = rAny; } + ::css::uno::Any getParallelDeflateException() const { return m_aParallelDeflateException; } + void closeEntry(); void write(const css::uno::Sequence< sal_Int8 >& rBuffer); diff --git a/package/source/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx index 7c7924d63ea7..4acfa77f0124 100644 --- a/package/source/zipapi/ZipOutputStream.cxx +++ b/package/source/zipapi/ZipOutputStream.cxx @@ -23,6 +23,7 @@ #include <com/sun/star/io/XInputStream.hpp> #include <com/sun/star/io/XOutputStream.hpp> #include <comphelper/storagehelper.hxx> +#include <cppuhelper/exc_hlp.hxx> #include <osl/diagnose.h> #include <osl/time.h> @@ -101,6 +102,11 @@ void ZipOutputStream::finish() m_rSharedThreadPool.waitUntilEmpty(); for (size_t i = 0; i < m_aEntries.size(); i++) { + //Any exceptions thrown in the threads were caught and stored for now + ::css::uno::Any aCaughtException(m_aEntries[i]->getParallelDeflateException()); + if (aCaughtException.hasValue()) + ::cppu::throwException(aCaughtException); + writeLOC(m_aEntries[i]->getZipEntry(), m_aEntries[i]->isEncrypt()); sal_Int32 nRead; diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx index a0fa26b6e66f..63b438a7a517 100644 --- a/package/source/zippackage/ZipPackageStream.cxx +++ b/package/source/zippackage/ZipPackageStream.cxx @@ -46,6 +46,7 @@ #include <comphelper/processfactory.hxx> #include <comphelper/seekableinput.hxx> #include <comphelper/storagehelper.hxx> +#include <cppuhelper/exc_hlp.hxx> #include <cppuhelper/supportsservice.hxx> #include <cppuhelper/typeprovider.hxx> @@ -471,8 +472,15 @@ public: private: virtual void doWork() SAL_OVERRIDE { - deflateZipEntry(mpEntry, mxInStream); - mxInStream.clear(); + try + { + deflateZipEntry(mpEntry, mxInStream); + mxInStream.clear(); + } + catch (const uno::Exception& rException) + { + mpEntry->setParallelDeflateException(::cppu::getCaughtException()); + } } }; |