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 +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 const aProps( ++ linguistic2::ProofreadingResult aRes; ++ ++ uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY ); ++ if (xGC.is()) ++ { ++ aGuard.clear(); ++ uno::Sequence 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 - 1:4.4.0.2-3-UNBUILT +- Resolves: rhbz#1184582 crash in grammar checking thread + * Mon Jan 19 2015 David Tardon - 1:4.4.0.2-2 - Resolves: rhbz#1180114 writerfilter: don't crash on w:customXmlDelRangeStart etc.