[libreoffice] Resolves: rhbz#1184582 crash in grammar checking thread

sbergmann sbergmann at fedoraproject.org
Thu Jan 22 12:24:36 UTC 2015


commit b41b4312b188d7bdc4025f43ae94e3f108a2c074
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Jan 22 13:24:57 2015 +0100

    Resolves: rhbz#1184582 crash in grammar checking thread

 ...2-At-least-catch-and-log-UNO-exceptions-i.patch |  153 ++++++++++++++++++++
 libreoffice.spec                                   |    6 +-
 2 files changed, 158 insertions(+), 1 deletions(-)
---
diff --git a/0001-rhbz-1184582-At-least-catch-and-log-UNO-exceptions-i.patch b/0001-rhbz-1184582-At-least-catch-and-log-UNO-exceptions-i.patch
new file mode 100644
index 0000000..ab90d30
--- /dev/null
+++ b/0001-rhbz-1184582-At-least-catch-and-log-UNO-exceptions-i.patch
@@ -0,0 +1,153 @@
+From dae6572c54a952d9da94261852496dc72fe51d92 Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman at redhat.com>
+Date: Thu, 22 Jan 2015 12:47:29 +0100
+Subject: [PATCH] rhbz#1184582: At least catch and log UNO exceptions in
+ grammar checking thread
+
+(cherry picked from commit b1dbc511eeaf88e3b4b5a8a2dce129d251d2dcb6)
+Conflicts:
+	linguistic/source/gciterator.cxx
+
+Change-Id: I87744f86d1413973709a46a58ebc03a39bce842c
+---
+ linguistic/source/gciterator.cxx | 110 +++++++++++++++++++++------------------
+ 1 file changed, 60 insertions(+), 50 deletions(-)
+
+diff --git a/linguistic/source/gciterator.cxx b/linguistic/source/gciterator.cxx
+index 41018e3..d3759eb 100644
+--- a/linguistic/source/gciterator.cxx
++++ b/linguistic/source/gciterator.cxx
+@@ -545,70 +545,80 @@ void GrammarCheckingIterator::DequeueAndCheck()
+ 
+             if (xFlatPara.is() && xFPIterator.is())
+             {
+-                OUString aCurTxt( xFlatPara->getText() );
+-                lang::Locale aCurLocale = lcl_GetPrimaryLanguageOfSentence( xFlatPara, aFPEntryItem.m_nStartIndex );
+-
+-                bModified = xFlatPara->isModified();
+-                if (!bModified)
++                try
+                 {
+-                    // ---- THREAD SAFE START ----
+-                    ::osl::ClearableGuard< ::osl::Mutex > aGuard( MyMutex::get() );
++                    OUString aCurTxt( xFlatPara->getText() );
++                    lang::Locale aCurLocale = lcl_GetPrimaryLanguageOfSentence( xFlatPara, aFPEntryItem.m_nStartIndex );
+ 
+-                    sal_Int32 nStartPos = aFPEntryItem.m_nStartIndex;
+-                    sal_Int32 nSuggestedEnd = GetSuggestedEndOfSentence( aCurTxt, nStartPos, aCurLocale );
+-                    DBG_ASSERT( (nSuggestedEnd == 0 && aCurTxt.isEmpty()) || nSuggestedEnd > nStartPos,
+-                            "nSuggestedEndOfSentencePos calculation failed?" );
++                    bModified = xFlatPara->isModified();
++                    if (!bModified)
++                    {
++                        // ---- THREAD SAFE START ----
++                        ::osl::ClearableGuard< ::osl::Mutex > aGuard( MyMutex::get() );
+ 
+-                    linguistic2::ProofreadingResult aRes;
++                        sal_Int32 nStartPos = aFPEntryItem.m_nStartIndex;
++                        sal_Int32 nSuggestedEnd = GetSuggestedEndOfSentence( aCurTxt, nStartPos, aCurLocale );
++                        DBG_ASSERT( (nSuggestedEnd == 0 && aCurTxt.isEmpty()) || nSuggestedEnd > nStartPos,
++                                    "nSuggestedEndOfSentencePos calculation failed?" );
+ 
+-                    uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY );
+-                    if (xGC.is())
+-                    {
+-                        aGuard.clear();
+-                        uno::Sequence<beans::PropertyValue> const aProps(
++                        linguistic2::ProofreadingResult aRes;
++
++                        uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY );
++                        if (xGC.is())
++                        {
++                            aGuard.clear();
++                            uno::Sequence<beans::PropertyValue> const aProps(
+                                 lcl_makeProperties(xFlatPara));
+-                        aRes = xGC->doProofreading( aCurDocId, aCurTxt,
+-                                aCurLocale, nStartPos, nSuggestedEnd, aProps );
+-
+-                        //!! work-around to prevent looping if the grammar checker
+-                        //!! failed to properly identify the sentence end
+-                        if (
+-                            aRes.nBehindEndOfSentencePosition <= nStartPos &&
+-                            aRes.nBehindEndOfSentencePosition != nSuggestedEnd
+-                           )
++                            aRes = xGC->doProofreading( aCurDocId, aCurTxt,
++                                                        aCurLocale, nStartPos, nSuggestedEnd, aProps );
++
++                            //!! work-around to prevent looping if the grammar checker
++                            //!! failed to properly identify the sentence end
++                            if (
++                                aRes.nBehindEndOfSentencePosition <= nStartPos &&
++                                aRes.nBehindEndOfSentencePosition != nSuggestedEnd
++                            )
++                            {
++                                DBG_ASSERT( false, "!! Grammarchecker failed to provide end of sentence !!" );
++                                aRes.nBehindEndOfSentencePosition = nSuggestedEnd;
++                            }
++
++                            aRes.xFlatParagraph      = xFlatPara;
++                            aRes.nStartOfSentencePosition = nStartPos;
++                        }
++                        else
+                         {
+-                            DBG_ASSERT( false, "!! Grammarchecker failed to provide end of sentence !!" );
+-                            aRes.nBehindEndOfSentencePosition = nSuggestedEnd;
++                            // no grammar checker -> no error
++                            // but we need to provide the data below in order to continue with the next sentence
++                            aRes.aDocumentIdentifier = aCurDocId;
++                            aRes.xFlatParagraph      = xFlatPara;
++                            aRes.aText               = aCurTxt;
++                            aRes.aLocale             = aCurLocale;
++                            aRes.nStartOfSentencePosition       = nStartPos;
++                            aRes.nBehindEndOfSentencePosition   = nSuggestedEnd;
+                         }
++                        aRes.nStartOfNextSentencePosition = lcl_SkipWhiteSpaces( aCurTxt, aRes.nBehindEndOfSentencePosition );
++                        aRes.nBehindEndOfSentencePosition = lcl_BacktraceWhiteSpaces( aCurTxt, aRes.nStartOfNextSentencePosition );
+ 
+-                        aRes.xFlatParagraph      = xFlatPara;
+-                        aRes.nStartOfSentencePosition = nStartPos;
++                        //guard has to be cleared as ProcessResult calls out of this class
++                        aGuard.clear();
++                        ProcessResult( aRes, xFPIterator, aFPEntryItem.m_bAutomatic );
++                        // ---- THREAD SAFE END ----
+                     }
+                     else
+                     {
+-                        // no grammar checker -> no error
+-                        // but we need to provide the data below in order to continue with the next sentence
+-                        aRes.aDocumentIdentifier = aCurDocId;
+-                        aRes.xFlatParagraph      = xFlatPara;
+-                        aRes.aText               = aCurTxt;
+-                        aRes.aLocale             = aCurLocale;
+-                        aRes.nStartOfSentencePosition       = nStartPos;
+-                        aRes.nBehindEndOfSentencePosition   = nSuggestedEnd;
++                        // the paragraph changed meanwhile... (and maybe is still edited)
++                        // thus we simply continue to ask for the next to be checked.
++                        uno::Reference< text::XFlatParagraph > xFlatParaNext( xFPIterator->getNextPara() );
++                        AddEntry( xFPIterator, xFlatParaNext, aCurDocId, 0, aFPEntryItem.m_bAutomatic );
+                     }
+-                    aRes.nStartOfNextSentencePosition = lcl_SkipWhiteSpaces( aCurTxt, aRes.nBehindEndOfSentencePosition );
+-                    aRes.nBehindEndOfSentencePosition = lcl_BacktraceWhiteSpaces( aCurTxt, aRes.nStartOfNextSentencePosition );
+-
+-                    //guard has to be cleared as ProcessResult calls out of this class
+-                    aGuard.clear();
+-                    ProcessResult( aRes, xFPIterator, aFPEntryItem.m_bAutomatic );
+-                    // ---- THREAD SAFE END ----
+                 }
+-                else
++                catch (css::uno::Exception & e)
+                 {
+-                    // the paragraph changed meanwhile... (and maybe is still edited)
+-                    // thus we simply continue to ask for the next to be checked.
+-                    uno::Reference< text::XFlatParagraph > xFlatParaNext( xFPIterator->getNextPara() );
+-                    AddEntry( xFPIterator, xFlatParaNext, aCurDocId, 0, aFPEntryItem.m_bAutomatic );
++                    SAL_WARN(
++                        "linguistic",
++                        "GrammarCheckingIterator::DequeueAndCheck ignoring UNO"
++                            " exception " << e.Message);
+                 }
+             }
+ 
+-- 
+1.9.3
+
diff --git a/libreoffice.spec b/libreoffice.spec
index 849c602..f777d30 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -46,7 +46,7 @@ Summary:        Free Software Productivity Suite
 Name:           libreoffice
 Epoch:          1
 Version:        %{libo_version}.2
-Release:        2%{?libo_prerelease}%{?dist}
+Release:        3%{?libo_prerelease}%{?dist}
 License:        (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 and CC0
 Group:          Applications/Productivity
 URL:            http://www.libreoffice.org/
@@ -330,6 +330,7 @@ Patch22: 0001-rhbz-1180114-writerfilter-don-t-crash-on-w-customXml.patch
 Patch23: 0001-if-we-change-the-keys-we-have-to-resort-based-on-the.patch
 Patch24: 0001-rhbz-1175027-sw-fix-life-cycle-of-SwConnectionDispos.patch
 Patch25: 0001-font-cache-gets-broken-on-adding-an-embedded-font.patch
+Patch26: 0001-rhbz-1184582-At-least-catch-and-log-UNO-exceptions-i.patch
 
 %define instdir %{_libdir}
 %define baseinstdir %{instdir}/libreoffice
@@ -2353,6 +2354,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 %endif
 
 %changelog
+* Thu Jan 22 2015 Stephan Bergmann <sbergman at redhat.com> - 1:4.4.0.2-3-UNBUILT
+- Resolves: rhbz#1184582 crash in grammar checking thread
+
 * Mon Jan 19 2015 David Tardon <dtardon at redhat.com> - 1:4.4.0.2-2
 - Resolves: rhbz#1180114 writerfilter: don't crash on w:customXmlDelRangeStart
   etc.


More information about the scm-commits mailing list