Resolves: rhbz#1184582 crash in grammar checking thread

f41
Stephan Bergmann 10 years ago
parent d69e3c99a1
commit b41b4312b1

@ -0,0 +1,153 @@
From dae6572c54a952d9da94261852496dc72fe51d92 Mon Sep 17 00:00:00 2001
From: Stephan Bergmann <sbergman@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

@ -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@redhat.com> - 1:4.4.0.2-3-UNBUILT
- Resolves: rhbz#1184582 crash in grammar checking thread
* Mon Jan 19 2015 David Tardon <dtardon@redhat.com> - 1:4.4.0.2-2
- Resolves: rhbz#1180114 writerfilter: don't crash on w:customXmlDelRangeStart
etc.

Loading…
Cancel
Save