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,

Reply via email to