Kaydet (Commit) f2f6bf1c authored tarafından Caolán McNamara's avatar Caolán McNamara

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

üst 41a0d247
...@@ -638,29 +638,38 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry ) ...@@ -638,29 +638,38 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry )
aGrabber >> nExtraLen; aGrabber >> nExtraLen;
rEntry.nOffset = static_cast < sal_Int32 > (aGrabber.getPosition()) + nPathLen + nExtraLen; rEntry.nOffset = static_cast < sal_Int32 > (aGrabber.getPosition()) + nPathLen + nExtraLen;
// read always in UTF8, some tools seem not to set UTF8 bit sal_Bool bBroken = sal_False;
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(), try
aNameBuffer.getLength(), {
RTL_TEXTENCODING_UTF8 ); // 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; bBroken = sal_True;
rEntry.sPath = sLOCPath;
} }
// 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 ) if ( bBroken && !bRecoveryMode )
throw ZipIOException( OUString( RTL_CONSTASCII_USTRINGPARAM( "The stream seems to be broken!" ) ), throw ZipIOException( OUString( RTL_CONSTASCII_USTRINGPARAM( "The stream seems to be broken!" ) ),
Reference< XInterface >() ); Reference< XInterface >() );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment