oox/source/export/drawingml.cxx |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit dd7d9a61c95bf9c13ded2044193d6b7a2e27b87b
Author:     Skyler Grey <skyler.g...@collabora.com>
AuthorDate: Mon Nov 18 14:20:29 2024 +0000
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Jan 23 16:42:38 2025 +0100

    fix(ooxmlexport): Prevent unknown media type crash
    
    To determine the extension of a media file, we just take whatever parts
    of the URL were left after the final dot.
    
    Normally this is something normal such as `mp4`, `mp3` or suchlike
    
    Unfortunately, sometimes (such as when in Collabora Online) this URL
    would is actually be something Uno-y, leaving an extension like
    
       Package:Media
    
    That's no good, because in Zip files we can't have colons in our names,
    at least according to our Zip file name checker, which looks through and
    denies access to any file names that have colons in
    
        bool OStorageHelper::IsValidZipEntryFileName( std::u16string_view 
aName, bool bSlashAllowed )
        {
            long nDots{0};
            for ( size_t i = 0; i < aName.size(); i++ )
            {
                switch ( aName[i] )
                {
                    // ------------------ 8< cut ------------------
                    case ':':
                        return false;
    
    Promptly causing us not to open a file output stream...
    
        if ( aElementName.isEmpty() || 
!::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, false ) )
            throw lang::IllegalArgumentException( THROW_WHERE "Unexpected entry 
name syntax.", uno::Reference< uno::XInterface >(), 1 );
    
        -> leading to implOpenSubStorage failing to set xSubXStorage...
    
        if( mxStorage.is() ) try
        {
            // XStorage::isStorageElement may throw various exceptions...
            if( mxStorage->isStorageElement( rElementName ) )
                xSubXStorage = mxStorage->openStorageElement(
                    rElementName, css::embed::ElementModes::READ );
        } catch ... { ... }
    
    ...and eventually to us never having an output stream in the first place...
    
        Reference<XOutputStream> xOutStream = 
mpFB->openFragmentStream(sFileName, aMimeType);
    
        gdb$ print xOutStream
        $1 = empty uno::Reference
    
    ...and crashing the code that tries to copy to that stream.
    
    The upshot of this bug is that any videos inserted with Collabora Online
    (or presumably similar .uno command use) crash LO when you later try to
    save your .pptx
    
    The quick fix here is to replace colons with another character, which is
    what I've done here. Future followup patches could do other sensible
    things like stopping crashes if we can't open an output stream for
    whatever reason or figuring out what to do with names that aren't
    permitted for reasons other than colon use.
    
    Change-Id: I9113b272d29f74882dc25bf6e74306bd9ecd58a2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180635
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index d3bc81b08b26..754ae8bd7c32 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1639,7 +1639,7 @@ void DrawingML::WriteMediaNonVisualProperties(const 
css::uno::Reference<css::dra
     const OUString& rURL(pMediaObj->getURL());
     int nLastDot = rURL.lastIndexOf('.');
     if (nLastDot >= 0)
-        aExtension = rURL.copy(nLastDot);
+        aExtension = rURL.copy(nLastDot).replace(':', '_'); // Colons are not 
allowed in Zip entry file names, see OStorageHelper::IsValidZipEntryFileName
 
     bool bEmbed = rURL.startsWith("vnd.sun.star.Package:");
     Relationship eMediaType = Relationship::VIDEO;

Reply via email to