Blame SOURCES/0003-Related-rhbz-1618703-Properly-handle-failure-encodin.patch

bf2fec
From 7d7089282e764d5c8481602fb2067c619882e45e Mon Sep 17 00:00:00 2001
bf2fec
From: Stephan Bergmann <sbergman@redhat.com>
bf2fec
Date: Thu, 23 Aug 2018 18:10:01 +0200
bf2fec
Subject: [PATCH 3/5] Related rhbz#1618703: Properly handle failure encoding MS
bf2fec
 file
bf2fec
MIME-Version: 1.0
bf2fec
Content-Type: text/plain; charset=UTF-8
bf2fec
Content-Transfer-Encoding: 8bit
bf2fec
bf2fec
...when e.g. FIPS mode makes EncryptRC4 (in sw/source/filter/ww8/wrtww8.cxx)
bf2fec
fail, but which hadn't been propagated out to SwWW8Writer::WriteStorage (in
bf2fec
sw/source/filter/ww8/wrtww8.cxx)
bf2fec
bf2fec
Reviewed-on: https://gerrit.libreoffice.org/59518
bf2fec
Tested-by: Jenkins
bf2fec
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
bf2fec
(cherry picked from commit 229340812f6e6cc8c868915055583f60c82a8cf3)
bf2fec
Conflicts:
bf2fec
	sw/source/filter/ww8/docxexport.cxx
bf2fec
bf2fec
...plus cherry-pick of follow-up 8114f976b897c4717368146a49d5404ef970c77a
bf2fec
"coverity#1438527 Nesting level does not match indentation"
bf2fec
bf2fec
Reviewed-on: https://gerrit.libreoffice.org/59572
bf2fec
Tested-by: Jenkins
bf2fec
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
bf2fec
Tested-by: Caolán McNamara <caolanm@redhat.com>
bf2fec
bf2fec
(cherry picked from commit 5be8cbdb874621111cb157a98013e254de3b269c)
bf2fec
Conflicts:
bf2fec
	sw/source/filter/ww8/wrtww8.cxx
bf2fec
bf2fec
Change-Id: I1123136ce1a25e181a0a27486954621a2dd095ea
bf2fec
---
bf2fec
 sw/source/filter/ww8/docxexport.cxx |  4 ++-
bf2fec
 sw/source/filter/ww8/docxexport.hxx |  2 +-
bf2fec
 sw/source/filter/ww8/rtfexport.cxx  |  4 ++-
bf2fec
 sw/source/filter/ww8/rtfexport.hxx  |  2 +-
bf2fec
 sw/source/filter/ww8/wrtww8.cxx     | 42 +++++++++++++++++++++--------
bf2fec
 sw/source/filter/ww8/wrtww8.hxx     |  6 ++---
bf2fec
 6 files changed, 42 insertions(+), 18 deletions(-)
bf2fec
bf2fec
diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx
bf2fec
index 477422bee989..0b40a58df2bf 100644
bf2fec
--- a/sw/source/filter/ww8/docxexport.cxx
bf2fec
+++ b/sw/source/filter/ww8/docxexport.cxx
bf2fec
@@ -490,7 +490,7 @@ void DocxExport::OutputDML(uno::Reference<drawing::XShape> const & xShape)
bf2fec
     aExport.WriteShape(xShape);
bf2fec
 }
bf2fec
 
bf2fec
-void DocxExport::ExportDocument_Impl()
bf2fec
+ErrCode DocxExport::ExportDocument_Impl()
bf2fec
 {
bf2fec
     // Set the 'Track Revisions' flag in the settings structure
bf2fec
     m_aSettings.trackRevisions = bool( RedlineFlags::On & m_nOrigRedlineFlags );
bf2fec
@@ -530,6 +530,8 @@ void DocxExport::ExportDocument_Impl()
bf2fec
     m_pStyles = nullptr;
bf2fec
     delete m_pSections;
bf2fec
     m_pSections = nullptr;
bf2fec
+
bf2fec
+    return ERRCODE_NONE;
bf2fec
 }
bf2fec
 
bf2fec
 void DocxExport::AppendSection( const SwPageDesc *pPageDesc, const SwSectionFormat* pFormat, sal_uLong nLnNum )
bf2fec
diff --git a/sw/source/filter/ww8/docxexport.hxx b/sw/source/filter/ww8/docxexport.hxx
bf2fec
index b553ba3f2601..8b42290594ae 100644
bf2fec
--- a/sw/source/filter/ww8/docxexport.hxx
bf2fec
+++ b/sw/source/filter/ww8/docxexport.hxx
bf2fec
@@ -191,7 +191,7 @@ public:
bf2fec
 
bf2fec
 protected:
bf2fec
     /// Format-dependent part of the actual export.
bf2fec
-    virtual void ExportDocument_Impl() override;
bf2fec
+    virtual ErrCode ExportDocument_Impl() override;
bf2fec
 
bf2fec
     /// Output SwEndNode
bf2fec
     virtual void OutputEndNode( const SwEndNode& ) override;
bf2fec
diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx
bf2fec
index 586dd01f23bd..679b96ac9a77 100644
bf2fec
--- a/sw/source/filter/ww8/rtfexport.cxx
bf2fec
+++ b/sw/source/filter/ww8/rtfexport.cxx
bf2fec
@@ -660,7 +660,7 @@ void RtfExport::WritePageDescTable()
bf2fec
     m_pTableInfo = std::make_shared<ww8::WW8TableInfo>();
bf2fec
 }
bf2fec
 
bf2fec
-void RtfExport::ExportDocument_Impl()
bf2fec
+ErrCode RtfExport::ExportDocument_Impl()
bf2fec
 {
bf2fec
     // Make the header
bf2fec
     Strm()
bf2fec
@@ -931,6 +931,8 @@ void RtfExport::ExportDocument_Impl()
bf2fec
     WriteMainText();
bf2fec
 
bf2fec
     Strm().WriteChar('}');
bf2fec
+
bf2fec
+    return ERRCODE_NONE;
bf2fec
 }
bf2fec
 
bf2fec
 void RtfExport::PrepareNewPageDesc(const SfxItemSet* pSet, const SwNode& rNd,
bf2fec
diff --git a/sw/source/filter/ww8/rtfexport.hxx b/sw/source/filter/ww8/rtfexport.hxx
bf2fec
index 869a888e9b25..b470ef593f30 100644
bf2fec
--- a/sw/source/filter/ww8/rtfexport.hxx
bf2fec
+++ b/sw/source/filter/ww8/rtfexport.hxx
bf2fec
@@ -117,7 +117,7 @@ public:
bf2fec
 
bf2fec
 protected:
bf2fec
     /// Format-dependent part of the actual export.
bf2fec
-    void ExportDocument_Impl() override;
bf2fec
+    ErrCode ExportDocument_Impl() override;
bf2fec
 
bf2fec
     void SectionBreaksAndFrames(const SwTextNode& /*rNode*/) override {}
bf2fec
 
bf2fec
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
bf2fec
index 12a8ef8b6f89..66e4448191ba 100644
bf2fec
--- a/sw/source/filter/ww8/wrtww8.cxx
bf2fec
+++ b/sw/source/filter/ww8/wrtww8.cxx
bf2fec
@@ -3110,7 +3110,7 @@ namespace
bf2fec
 {
bf2fec
     const sal_uLong WW_BLOCKSIZE = 0x200;
bf2fec
 
bf2fec
-    void EncryptRC4(msfilter::MSCodec_Std97& rCtx, SvStream &rIn, SvStream &rOut)
bf2fec
+    ErrCode EncryptRC4(msfilter::MSCodec_Std97& rCtx, SvStream &rIn, SvStream &rOut)
bf2fec
     {
bf2fec
         rIn.Seek(STREAM_SEEK_TO_END);
bf2fec
         sal_uLong nLen = rIn.Tell();
bf2fec
@@ -3121,14 +3121,17 @@ namespace
bf2fec
         {
bf2fec
             std::size_t nBS = (nLen - nI > WW_BLOCKSIZE) ? WW_BLOCKSIZE : nLen - nI;
bf2fec
             nBS = rIn.ReadBytes(in, nBS);
bf2fec
-            rCtx.InitCipher(nBlock);
bf2fec
+            if (!rCtx.InitCipher(nBlock)) {
bf2fec
+                return ERRCODE_IO_NOTSUPPORTED;
bf2fec
+            }
bf2fec
             rCtx.Encode(in, nBS, in, nBS);
bf2fec
             rOut.WriteBytes(in, nBS);
bf2fec
         }
bf2fec
+        return ERRCODE_NONE;
bf2fec
     }
bf2fec
 }
bf2fec
 
bf2fec
-void MSWordExportBase::ExportDocument( bool bWriteAll )
bf2fec
+ErrCode MSWordExportBase::ExportDocument( bool bWriteAll )
bf2fec
 {
bf2fec
     m_nCharFormatStart = DEFAULT_STYLES_COUNT;
bf2fec
     m_nFormatCollStart = m_nCharFormatStart + m_pDoc->GetCharFormats()->size() - 1;
bf2fec
@@ -3195,7 +3198,7 @@ void MSWordExportBase::ExportDocument( bool bWriteAll )
bf2fec
     if ( m_pDoc->getIDocumentDrawModelAccess().GetDrawModel() )
bf2fec
         m_pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage( 0 )->RecalcObjOrdNums();
bf2fec
 
bf2fec
-    ExportDocument_Impl();
bf2fec
+    ErrCode err = ExportDocument_Impl();
bf2fec
 
bf2fec
     m_aFrames.clear();
bf2fec
 
bf2fec
@@ -3208,6 +3211,8 @@ void MSWordExportBase::ExportDocument( bool bWriteAll )
bf2fec
     *m_pCurPam = *m_pOrigPam;
bf2fec
 
bf2fec
     m_pDoc->getIDocumentRedlineAccess().SetRedlineFlags(m_nOrigRedlineFlags);
bf2fec
+
bf2fec
+    return err;
bf2fec
 }
bf2fec
 
bf2fec
 bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec )
bf2fec
@@ -3262,7 +3267,7 @@ bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec
bf2fec
     return ( aEncryptionData.getLength() != 0 );
bf2fec
 }
bf2fec
 
bf2fec
-void WW8Export::ExportDocument_Impl()
bf2fec
+ErrCode WW8Export::ExportDocument_Impl()
bf2fec
 {
bf2fec
     PrepareStorage();
bf2fec
 
bf2fec
@@ -3360,6 +3365,7 @@ void WW8Export::ExportDocument_Impl()
bf2fec
 
bf2fec
     StoreDoc1();
bf2fec
 
bf2fec
+    ErrCode err = ERRCODE_NONE;
bf2fec
     if ( bEncrypt )
bf2fec
     {
bf2fec
         SvStream *pStrmTemp, *pTableStrmTemp, *pDataStrmTemp;
bf2fec
@@ -3367,10 +3373,17 @@ void WW8Export::ExportDocument_Impl()
bf2fec
         pTableStrmTemp = xTableStrm.get();
bf2fec
         pDataStrmTemp = xDataStrm.get();
bf2fec
 
bf2fec
-        if ( pDataStrmTemp && pDataStrmTemp != pStrmTemp)
bf2fec
-            EncryptRC4(aCtx, *pDataStrm, *pDataStrmTemp);
bf2fec
+        if ( pDataStrmTemp && pDataStrmTemp != pStrmTemp) {
bf2fec
+            err = EncryptRC4(aCtx, *pDataStrm, *pDataStrmTemp);
bf2fec
+            if (err != ERRCODE_NONE) {
bf2fec
+                goto done;
bf2fec
+            }
bf2fec
+        }
bf2fec
 
bf2fec
-        EncryptRC4(aCtx, *pTableStrm, *pTableStrmTemp);
bf2fec
+        err = EncryptRC4(aCtx, *pTableStrm, *pTableStrmTemp);
bf2fec
+        if (err != ERRCODE_NONE) {
bf2fec
+            goto done;
bf2fec
+        }
bf2fec
 
bf2fec
         // Write Unencrypted Header 52 bytes to the start of the table stream
bf2fec
         // EncryptionVersionInfo (4 bytes): A Version structure where Version.vMajor MUST be 0x0001, and Version.vMinor MUST be 0x0001.
bf2fec
@@ -3388,7 +3401,10 @@ void WW8Export::ExportDocument_Impl()
bf2fec
         pTableStrmTemp->WriteBytes(pSaltData, 16);
bf2fec
         pTableStrmTemp->WriteBytes(pSaltDigest, 16);
bf2fec
 
bf2fec
-        EncryptRC4(aCtx, GetWriter().Strm(), *pStrmTemp);
bf2fec
+        err = EncryptRC4(aCtx, GetWriter().Strm(), *pStrmTemp);
bf2fec
+        if (err != ERRCODE_NONE) {
bf2fec
+            goto done;
bf2fec
+        }
bf2fec
 
bf2fec
         // Write Unencrypted Fib 68 bytes to the start of the workdocument stream
bf2fec
         pFib->m_fEncrypted = true; // fEncrypted indicates the document is encrypted.
bf2fec
@@ -3398,6 +3414,7 @@ void WW8Export::ExportDocument_Impl()
bf2fec
 
bf2fec
         pStrmTemp->Seek( 0 );
bf2fec
         pFib->WriteHeader( *pStrmTemp );
bf2fec
+    done:;
bf2fec
     }
bf2fec
 
bf2fec
     DELETEZ( m_pGrf );
bf2fec
@@ -3438,6 +3455,8 @@ void WW8Export::ExportDocument_Impl()
bf2fec
         pDataStrm = nullptr;
bf2fec
         GetWriter().GetStorage().Remove(SL::aData);
bf2fec
     }
bf2fec
+
bf2fec
+    return err;
bf2fec
 }
bf2fec
 
bf2fec
 void WW8Export::PrepareStorage()
bf2fec
@@ -3517,16 +3536,17 @@ ErrCode SwWW8Writer::WriteStorage()
bf2fec
     }
bf2fec
 
bf2fec
     // Do the actual export
bf2fec
+    ErrCode err = ERRCODE_NONE;
bf2fec
     {
bf2fec
         bool bDot = mpMedium->GetFilter()->GetName().endsWith("Vorlage");
bf2fec
         WW8Export aExport(this, pDoc, pCurPam, pOrigPam, bDot);
bf2fec
         m_pExport = &aExport;
bf2fec
-        aExport.ExportDocument( bWriteAll );
bf2fec
+        err = aExport.ExportDocument( bWriteAll );
bf2fec
         m_pExport = nullptr;
bf2fec
     }
bf2fec
 
bf2fec
     ::EndProgress( pDoc->GetDocShell() );
bf2fec
-    return ERRCODE_NONE;
bf2fec
+    return err;
bf2fec
 }
bf2fec
 
bf2fec
 ErrCode SwWW8Writer::WriteMedium( SfxMedium& )
bf2fec
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
bf2fec
index 7195677f4688..56bea59191d6 100644
bf2fec
--- a/sw/source/filter/ww8/wrtww8.hxx
bf2fec
+++ b/sw/source/filter/ww8/wrtww8.hxx
bf2fec
@@ -574,7 +574,7 @@ public:
bf2fec
 
bf2fec
 public:
bf2fec
     /// The main function to export the document.
bf2fec
-    void ExportDocument( bool bWriteAll );
bf2fec
+    ErrCode ExportDocument( bool bWriteAll );
bf2fec
 
bf2fec
     /// Iterate through the nodes and call the appropriate OutputNode() on them.
bf2fec
     void WriteText();
bf2fec
@@ -788,7 +788,7 @@ public:
bf2fec
 
bf2fec
 protected:
bf2fec
     /// Format-dependent part of the actual export.
bf2fec
-    virtual void ExportDocument_Impl() = 0;
bf2fec
+    virtual ErrCode ExportDocument_Impl() = 0;
bf2fec
 
bf2fec
     /// Get the next position in the text node to output
bf2fec
     sal_Int32 GetNextPos( SwWW8AttrIter const * pAttrIter, const SwTextNode& rNode, sal_Int32 nAktPos );
bf2fec
@@ -985,7 +985,7 @@ public:
bf2fec
     virtual bool AddSectionBreaksForTOX() const override { return false; }
bf2fec
 private:
bf2fec
     /// Format-dependent part of the actual export.
bf2fec
-    virtual void ExportDocument_Impl() override;
bf2fec
+    virtual ErrCode ExportDocument_Impl() override;
bf2fec
 
bf2fec
     void PrepareStorage();
bf2fec
     void WriteFkpPlcUsw();
bf2fec
-- 
bf2fec
2.17.1
bf2fec