From f989bd22cc3c80d3c5119e3de1a269ab9a80bd78 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Tue, 10 Aug 2021 10:13:04 +0200 Subject: Catch exceptions when setting up linguistic extensions ...not only from the createInstance calls, but also from later calls like XSpellChecker::getLocales. At least when installing (which only contains native code for macOS and Windows) on Linux, that getLocales call would cause a RuntimeException, but which was effectively left uncaught and thus caused a crash. Change-Id: Id06760cb91b9aef2f3bbfe94213e40146214903d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120260 Tested-by: Jenkins Reviewed-by: Stephan Bergmann --- linguistic/source/lngsvcmgr.cxx | 116 ++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 65 deletions(-) (limited to 'linguistic') diff --git a/linguistic/source/lngsvcmgr.cxx b/linguistic/source/lngsvcmgr.cxx index b4b8d3836f6e..a0f9822e4779 100644 --- a/linguistic/source/lngsvcmgr.cxx +++ b/linguistic/source/lngsvcmgr.cxx @@ -940,7 +940,6 @@ void LngSvcMgr::GetAvailableSpellSvcs_Impl() uno::Reference< lang::XSingleComponentFactory > xCompFactory; uno::Reference< lang::XSingleServiceFactory > xFactory; - uno::Reference< linguistic2::XSpellChecker > xSvc; xCompFactory.set(aCurrent, css::uno::UNO_QUERY); if (!xCompFactory.is()) { @@ -950,27 +949,24 @@ void LngSvcMgr::GetAvailableSpellSvcs_Impl() { try { - xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY ); + uno::Reference< linguistic2::XSpellChecker > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW ); + + OUString aImplName; + std::vector< LanguageType > aLanguages; + uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); + if (xInfo.is()) + aImplName = xInfo->getImplementationName(); + SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); + uno::Sequence aLocaleSequence(xSvc->getLocales()); + aLanguages = LocaleSeqToLangVec( aLocaleSequence ); + + pAvailSpellSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); } catch (const uno::Exception &) { SAL_WARN( "linguistic", "createInstance failed" ); } } - - if (xSvc.is()) - { - OUString aImplName; - std::vector< LanguageType > aLanguages; - uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); - if (xInfo.is()) - aImplName = xInfo->getImplementationName(); - SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); - uno::Sequence aLocaleSequence(xSvc->getLocales()); - aLanguages = LocaleSeqToLangVec( aLocaleSequence ); - - pAvailSpellSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); - } } } @@ -998,7 +994,6 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl() uno::Reference< lang::XSingleComponentFactory > xCompFactory; uno::Reference< lang::XSingleServiceFactory > xFactory; - uno::Reference< linguistic2::XProofreader > xSvc; xCompFactory.set(aCurrent, css::uno::UNO_QUERY); if (!xCompFactory.is()) { @@ -1008,13 +1003,24 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl() { try { - if (xCompFactory.is()) - { - xSvc.set(xCompFactory->createInstanceWithContext(xContext), uno::UNO_QUERY); - } - else + uno::Reference< linguistic2::XProofreader > xSvc( + xCompFactory.is() + ? xCompFactory->createInstanceWithContext(xContext) + : xFactory->createInstance(), + uno::UNO_QUERY_THROW); + + if (pAvailGrammarSvcs) { - xSvc.set(xFactory->createInstance(), uno::UNO_QUERY); + OUString aImplName; + std::vector< LanguageType > aLanguages; + uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); + if (xInfo.is()) + aImplName = xInfo->getImplementationName(); + SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); + uno::Sequence aLocaleSequence(xSvc->getLocales()); + aLanguages = LocaleSeqToLangVec( aLocaleSequence ); + + pAvailGrammarSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); } } catch (const uno::Exception &) @@ -1023,19 +1029,6 @@ void LngSvcMgr::GetAvailableGrammarSvcs_Impl() } } - if (xSvc.is() && pAvailGrammarSvcs) - { - OUString aImplName; - std::vector< LanguageType > aLanguages; - uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); - if (xInfo.is()) - aImplName = xInfo->getImplementationName(); - SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); - uno::Sequence aLocaleSequence(xSvc->getLocales()); - aLanguages = LocaleSeqToLangVec( aLocaleSequence ); - - pAvailGrammarSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); - } } } @@ -1062,7 +1055,6 @@ void LngSvcMgr::GetAvailableHyphSvcs_Impl() uno::Reference< lang::XSingleComponentFactory > xCompFactory; uno::Reference< lang::XSingleServiceFactory > xFactory; - uno::Reference< linguistic2::XHyphenator > xSvc; xCompFactory.set(aCurrent, css::uno::UNO_QUERY); if (!xCompFactory.is()) { @@ -1072,25 +1064,22 @@ void LngSvcMgr::GetAvailableHyphSvcs_Impl() { try { - xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY ); + uno::Reference< linguistic2::XHyphenator > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW ); + OUString aImplName; + std::vector< LanguageType > aLanguages; + uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); + if (xInfo.is()) + aImplName = xInfo->getImplementationName(); + SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); + uno::Sequence aLocaleSequence(xSvc->getLocales()); + aLanguages = LocaleSeqToLangVec( aLocaleSequence ); + pAvailHyphSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); } catch (const uno::Exception &) { SAL_WARN( "linguistic", "createInstance failed" ); } } - if (xSvc.is()) - { - OUString aImplName; - std::vector< LanguageType > aLanguages; - uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); - if (xInfo.is()) - aImplName = xInfo->getImplementationName(); - SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); - uno::Sequence aLocaleSequence(xSvc->getLocales()); - aLanguages = LocaleSeqToLangVec( aLocaleSequence ); - pAvailHyphSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); - } } } @@ -1118,7 +1107,6 @@ void LngSvcMgr::GetAvailableThesSvcs_Impl() uno::Reference< lang::XSingleComponentFactory > xCompFactory; uno::Reference< lang::XSingleServiceFactory > xFactory; - uno::Reference< linguistic2::XThesaurus > xSvc; xCompFactory.set(aCurrent, css::uno::UNO_QUERY); if (!xCompFactory.is()) { @@ -1128,26 +1116,24 @@ void LngSvcMgr::GetAvailableThesSvcs_Impl() { try { - xSvc.set( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY ); + uno::Reference< linguistic2::XThesaurus > xSvc( ( xCompFactory.is() ? xCompFactory->createInstanceWithContext( xContext ) : xFactory->createInstance() ), uno::UNO_QUERY_THROW ); + + OUString aImplName; + std::vector< LanguageType > aLanguages; + uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); + if (xInfo.is()) + aImplName = xInfo->getImplementationName(); + SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); + uno::Sequence aLocaleSequence(xSvc->getLocales()); + aLanguages = LocaleSeqToLangVec( aLocaleSequence ); + + pAvailThesSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); } catch (const uno::Exception &) { SAL_WARN( "linguistic", "createInstance failed" ); } } - if (xSvc.is()) - { - OUString aImplName; - std::vector< LanguageType > aLanguages; - uno::Reference< XServiceInfo > xInfo( xSvc, uno::UNO_QUERY ); - if (xInfo.is()) - aImplName = xInfo->getImplementationName(); - SAL_WARN_IF( aImplName.isEmpty(), "linguistic", "empty implementation name" ); - uno::Sequence aLocaleSequence(xSvc->getLocales()); - aLanguages = LocaleSeqToLangVec( aLocaleSequence ); - - pAvailThesSvcs->push_back( std::make_unique( aImplName, aLanguages ) ); - } } } -- cgit