compilerplugins/clang/unusedfields.writeonly.results | 2 xmlhelp/source/cxxhelp/provider/databases.cxx | 92 ++++++------------- xmlhelp/source/cxxhelp/provider/databases.hxx | 6 - 3 files changed, 32 insertions(+), 68 deletions(-)
New commits: commit 871dc7bce19242e467d98a02108a8eb8668f2ea1 Author: Julien Nabet <serval2...@yahoo.fr> AuthorDate: Mon Apr 28 22:55:33 2025 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Apr 30 13:40:13 2025 +0200 tdf#165980: fix crash when launching help with "--with-help" assertion: 5 0x00007f0f5578cf2a in ByteGrabber::ByteGrabber (this=0x558123967710, xIstream=uno::Reference to (chelp::XInputStream_impl *) 0x558124099a20) at /home/julien/lo/libo_perf/package/source/zipapi/ByteGrabber.cxx:44 6 0x00007f0f557a0793 in ZipFile::ZipFile (this=0x558123967640, aMutexHolder=empty rtl::Reference, xInput=uno::Reference to (chelp::XInputStream_impl *) 0x558124099a20, xContext=uno::Reference to (cppu::(anonymous namespace)::ComponentContext *) 0x558121aacc48, bInitialise=true, bForceRecovery=false, checks=ZipFile::Checks::Default) at /home/julien/lo/libo_perf/package/source/zipapi/ZipFile.cxx:90 7 0x00007f0f5580208d in std::_Construct<ZipFile, rtl::Reference<comphelper::RefCountedMutex>&, com::sun::star::uno::Reference<com::sun::star::io::XInputStream>&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, bool, bool&, ZipFile::Checks> (__p=0x558123967640) at /usr/include/c++/14/bits/stl_construct.h:119 8 0x00007f0f557ffb2d in std::_Optional_payload_base<ZipFile>::_M_construct<rtl::Reference<comphelper::RefCountedMutex>&, com::sun::star::uno::Reference<com::sun::star::io::XInputStream>&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, bool, bool&, ZipFile::Checks> (this=0x558123967640) at /usr/include/c++/14/optional:274 9 0x00007f0f557fd87d in std::_Optional_base_impl<ZipFile, std::_Optional_base<ZipFile, false, false> >::_M_construct<rtl::Reference<comphelper::RefCountedMutex>&, com::sun::star::uno::Reference<com::sun::star::io::XInputStream>&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, bool, bool&, ZipFile::Checks> (this=0x558123967640) at /usr/include/c++/14/optional:455 10 0x00007f0f557f9186 in std::optional<ZipFile>::emplace<rtl::Reference<comphelper::RefCountedMutex>&, com::sun::star::uno::Reference<com::sun::star::io::XInputStream>&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, bool, bool&, ZipFile::Checks> (this=0x558123967640) at /usr/include/c++/14/optional:916 11 0x00007f0f557e63f3 in ZipPackage::initialize (this=0x558123967510, aArguments=uno::Sequence of length 2 = {...}) at /home/julien/lo/libo_perf/package/source/zippackage/ZipPackage.cxx:893 12 0x00007f0f876d6b87 in cppuhelper::ServiceManager::Data::Implementation::doCreateInstanceWithArguments (this=0x558121b4fd80, context=uno::Reference to (cppu::(anonymous namespace)::ComponentContext *) 0x558121aacc48, arguments=uno::Sequence of length 2 = {...}) at /home/julien/lo/libo_perf/cppuhelper/source/servicemanager.cxx:728 13 0x00007f0f876d6884 in cppuhelper::ServiceManager::Data::Implementation::createInstanceWithArguments (this=0x558121b4fd80, context=uno::Reference to (cppu::(anonymous namespace)::ComponentContext *) 0x558121aacc48, singletonRequest=false, arguments=uno::Sequence of length 2 = {...}) at /home/julien/lo/libo_perf/cppuhelper/source/servicemanager.cxx:690 14 0x00007f0f876d9860 in cppuhelper::ServiceManager::createInstanceWithArgumentsAndContext (this=0x558121ab2c10, ServiceSpecifier="com.sun.star.packages.comp.ZipPackage", Arguments=uno::Sequence of length 2 = {...}, Context=uno::Reference to (cppu::(anonymous namespace)::ComponentContext *) 0x558121aacc48) at /home/julien/lo/libo_perf/cppuhelper/source/servicemanager.cxx:1015 15 0x00007f0f5552856d in chelp::Databases::jarFile (this=0x55812318ee80, rGuard=..., jar=u"shared.jar", Language="fr") at /home/julien/lo/libo_perf/xmlhelp/source/cxxhelp/provider/databases.cxx:842 16 0x00007f0f5552c519 in chelp::JarFileIterator::nextJarFile (this=0x7ffc4d067e80, rGuard=..., o_xParentPackageBundle=empty uno::Reference, o_pExtensionPath=0x0, o_pExtensionRegistryPath=0x0) at /home/julien/lo/libo_perf/xmlhelp/source/cxxhelp/provider/databases.cxx:1593 See almost full bt here: https://bugs.documentfoundation.org/attachment.cgi?id=200590&action=edit The way to retrieve the zip content (Jar is a zip) since the stream didn't implement comphelper::ByteReader. Instead of changing XInputStream_impl to implement it, I thought it could be interesting to copy a bulletproof way from by using ZipPackageHelper in unotools/source/misc/ZipPackageHelper.cxx m_aZipFileTable is now completely useless (BTW compilerplugins/clang/unusedfields.writeonly.results already indicated that the member was only written) If if it works well, we could get rid of xmlhelp/source/cxxhelp/provider/inputstream.hxx and cxx associated. Change-Id: Ie9c3b5808c835206830e87b129efcdf98ba505af Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184732 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins diff --git a/compilerplugins/clang/unusedfields.writeonly.results b/compilerplugins/clang/unusedfields.writeonly.results index 1879456be908..b8f1c02ac72c 100644 --- a/compilerplugins/clang/unusedfields.writeonly.results +++ b/compilerplugins/clang/unusedfields.writeonly.results @@ -1944,8 +1944,6 @@ xmlhelp/source/cxxhelp/provider/databases.hxx:264 chelp::Databases m_aModInfo ModInfoTable xmlhelp/source/cxxhelp/provider/databases.hxx:267 chelp::Databases m_aKeywordInfo KeywordInfoTable -xmlhelp/source/cxxhelp/provider/databases.hxx:273 - chelp::Databases m_aZipFileTable ZipFileTable xmlhelp/source/cxxhelp/provider/databases.hxx:279 chelp::Databases m_aCollatorTable CollatorTable xmloff/qa/unit/uxmloff.cxx:107 diff --git a/xmlhelp/source/cxxhelp/provider/databases.cxx b/xmlhelp/source/cxxhelp/provider/databases.cxx index d1662f72da4a..ba1ab577f5f5 100644 --- a/xmlhelp/source/cxxhelp/provider/databases.cxx +++ b/xmlhelp/source/cxxhelp/provider/databases.cxx @@ -793,73 +793,45 @@ Reference< XHierarchicalNameAccess > Databases::jarFile( OUString key = processLang(rGuard, Language) + "/" + jar; - ZipFileTable::iterator it = - m_aZipFileTable.emplace( key,Reference< XHierarchicalNameAccess >(nullptr) ).first; - - if( ! it->second.is() ) + css::uno::Reference< css::container::XHierarchicalNameAccess > xHNameAccess; + try { - try + OUString zipFile; + // Extension jar file? Search for ? + size_t nQuestionMark1 = jar.find( '?' ); + size_t nQuestionMark2 = jar.rfind( '?' ); + if( nQuestionMark1 != std::u16string_view::npos && nQuestionMark2 != std::u16string_view::npos && nQuestionMark1 != nQuestionMark2 ) { - OUString zipFile; - // Extension jar file? Search for ? - size_t nQuestionMark1 = jar.find( '?' ); - size_t nQuestionMark2 = jar.rfind( '?' ); - if( nQuestionMark1 != std::u16string_view::npos && nQuestionMark2 != std::u16string_view::npos && nQuestionMark1 != nQuestionMark2 ) - { - std::u16string_view aExtensionPath = jar.substr( nQuestionMark1 + 1, nQuestionMark2 - nQuestionMark1 - 1 ); - std::u16string_view aPureJar = jar.substr( nQuestionMark2 + 1 ); - - zipFile = expandURL(rGuard, OUString::Concat(aExtensionPath) + "/" + aPureJar); - } - else - { - zipFile = m_aInstallDirectory + key; - } - - Sequence< Any > aArguments( 2 ); - auto pArguments = aArguments.getArray(); - - rtl::Reference<XInputStream_impl> p(new XInputStream_impl( zipFile )); - if( p->CtorSuccess() ) - { - pArguments[ 0 ] <<= Reference< XInputStream >( p ); - } - else - { - p.clear(); - pArguments[ 0 ] <<= zipFile; - } - - // let ZipPackage be used ( no manifest.xml is required ) - beans::NamedValue aArg; - aArg.Name = "StorageFormat"; - aArg.Value <<= ZIP_STORAGE_FORMAT_STRING; - pArguments[ 1 ] <<= aArg; - - Reference< XInterface > xIfc - = m_xSMgr->createInstanceWithArgumentsAndContext( - u"com.sun.star.packages.comp.ZipPackage"_ustr, - aArguments, m_xContext ); + std::u16string_view aExtensionPath = jar.substr( nQuestionMark1 + 1, nQuestionMark2 - nQuestionMark1 - 1 ); + std::u16string_view aPureJar = jar.substr( nQuestionMark2 + 1 ); - if ( xIfc.is() ) - { - it->second.set( xIfc, UNO_QUERY ); - - OSL_ENSURE( it->second.is(), - "ContentProvider::createPackage - " - "Got no hierarchical name access!" ); - - } - } - catch ( RuntimeException & ) - { + zipFile = expandURL(rGuard, OUString::Concat(aExtensionPath) + "/" + aPureJar); } - catch ( Exception & ) + else { + zipFile = m_aInstallDirectory + key; } - } - return it->second; + // create the package zip file + Sequence< Any > aArguments{ + Any(zipFile), + // let ZipPackage be used + Any(beans::NamedValue(u"StorageFormat"_ustr, Any(ZIP_STORAGE_FORMAT_STRING))) + }; + + xHNameAccess.set( + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + u"com.sun.star.packages.comp.ZipPackage"_ustr, + aArguments, m_xContext ), UNO_QUERY); + } + catch ( RuntimeException & ) + { + } + catch ( Exception & ) + { + } + // get root zip folder + return xHNameAccess; } Reference< XHierarchicalNameAccess > Databases::findJarFileForPath diff --git a/xmlhelp/source/cxxhelp/provider/databases.hxx b/xmlhelp/source/cxxhelp/provider/databases.hxx index c7c81845cbe0..e4adb6d305a1 100644 --- a/xmlhelp/source/cxxhelp/provider/databases.hxx +++ b/xmlhelp/source/cxxhelp/provider/databases.hxx @@ -266,12 +266,6 @@ namespace chelp { typedef std::unordered_map< OUString, std::unique_ptr<KeywordInfo> > KeywordInfoTable; KeywordInfoTable m_aKeywordInfo; // Module information - typedef - std::unordered_map< - OUString, - css::uno::Reference< css::container::XHierarchicalNameAccess > > ZipFileTable; - ZipFileTable m_aZipFileTable; // No closing of an once opened jarfile - typedef std::unordered_map< OUString,