[Libreoffice-commits] .: package/source

Caolán McNamara caolan at kemper.freedesktop.org
Thu Nov 25 08:47:14 PST 2010


 package/source/zipapi/ZipFile.cxx |   45 ++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 18 deletions(-)

New commits:
commit 047a986e3af855cdb4c27274da5a10fb5da37fb6
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Nov 25 16:46:43 2010 +0000

    Resolves: rhbz#656191 Catch bad alloc and convert to ZipIOException

diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx
index 7768470..0cfb519 100644
--- a/package/source/zipapi/ZipFile.cxx
+++ b/package/source/zipapi/ZipFile.cxx
@@ -638,29 +638,38 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry )
     aGrabber >> nExtraLen;
     rEntry.nOffset = static_cast < sal_Int32 > (aGrabber.getPosition()) + nPathLen + nExtraLen;
 
-    // read always in UTF8, some tools seem not to set UTF8 bit
-    uno::Sequence < sal_Int8 > aNameBuffer( nPathLen );
-    sal_Int32 nRead = aGrabber.readBytes( aNameBuffer, nPathLen );
-    if ( nRead < aNameBuffer.getLength() )
-            aNameBuffer.realloc( nRead );
+    sal_Bool bBroken = sal_False;
 
-    ::rtl::OUString sLOCPath = rtl::OUString::intern( (sal_Char *) aNameBuffer.getArray(),
-                                                        aNameBuffer.getLength(),
-                                                        RTL_TEXTENCODING_UTF8 );
+    try
+    {
+        // read always in UTF8, some tools seem not to set UTF8 bit
+        uno::Sequence < sal_Int8 > aNameBuffer( nPathLen );
+        sal_Int32 nRead = aGrabber.readBytes( aNameBuffer, nPathLen );
+        if ( nRead < aNameBuffer.getLength() )
+                aNameBuffer.realloc( nRead );
+
+        ::rtl::OUString sLOCPath = rtl::OUString::intern( (sal_Char *) aNameBuffer.getArray(),
+                                                            aNameBuffer.getLength(),
+                                                            RTL_TEXTENCODING_UTF8 );
+
+        if ( rEntry.nPathLen == -1 ) // the file was created
+        {
+            rEntry.nPathLen = nPathLen;
+            rEntry.sPath = sLOCPath;
+        }
 
-    if ( rEntry.nPathLen == -1 ) // the file was created
+        // the method can be reset for internal use so it is not checked
+        bBroken = rEntry.nVersion != nVersion
+                        || rEntry.nFlag != nFlag
+                        || rEntry.nTime != nTime
+                        || rEntry.nPathLen != nPathLen
+                        || !rEntry.sPath.equals( sLOCPath );
+    }
+    catch(::std::bad_alloc &)
     {
-        rEntry.nPathLen = nPathLen;
-        rEntry.sPath = sLOCPath;
+        bBroken = sal_True;
     }
 
-    // the method can be reset for internal use so it is not checked
-    sal_Bool bBroken = rEntry.nVersion != nVersion
-                    || rEntry.nFlag != nFlag
-                    || rEntry.nTime != nTime
-                    || rEntry.nPathLen != nPathLen
-                    || !rEntry.sPath.equals( sLOCPath );
-
     if ( bBroken && !bRecoveryMode )
         throw ZipIOException( OUString( RTL_CONSTASCII_USTRINGPARAM( "The stream seems to be broken!" ) ),
                             Reference< XInterface >() );


More information about the Libreoffice-commits mailing list