diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-04-17 16:45:23 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-04-17 16:46:14 +0100 |
commit | 9ff94ae0fa947c5fd6a31fbc38421f60eb5e1fba (patch) | |
tree | 002b55a59e8a5a7b851adfbd2edad17ca509b67f /vcl | |
parent | b1bee56af9a4cbbaabfe43290d28f53efdebc14d (diff) |
png parsing regression test
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/gdi/pngread.cxx | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/vcl/source/gdi/pngread.cxx b/vcl/source/gdi/pngread.cxx index a85a8ecc3238..d279c0126e41 100644 --- a/vcl/source/gdi/pngread.cxx +++ b/vcl/source/gdi/pngread.cxx @@ -194,6 +194,7 @@ PNGReaderImpl::PNGReaderImpl( SvStream& rPNGStream ) mpScanCurrent ( NULL ), mpColorTable ( (sal_uInt8*) mpDefaultColorTable ), mnPass ( 0 ), + mbPalette( sal_False ), mbzCodecInUse ( sal_False ), mbStatus( sal_True), mbIDAT( sal_False ), @@ -297,7 +298,7 @@ bool PNGReaderImpl::ReadNextChunk() nCRC32 = rtl_crc32( nCRC32, &rChunkData.aData[ 0 ], mnChunkLen ); maDataIter = rChunkData.aData.begin(); } - sal_uInt32 nCheck; + sal_uInt32 nCheck(0); mrPNGStream >> nCheck; if( nCRC32 != nCheck ) return false; @@ -339,14 +340,23 @@ BitmapEx PNGReaderImpl::GetBitmapEx( const Size& rPreviewSizeHint ) // reset to the first chunk maChunkIter = maChunkSeq.begin(); - // parse the chunks + // first chunk must be IDHR + if( mbStatus && ReadNextChunk() ) + { + if (mnChunkType == PNGCHUNK_IHDR) + mbStatus = ImplReadHeader( rPreviewSizeHint ); + else + mbStatus = false; + } + + // parse the remaining chunks while( mbStatus && !mbIDAT && ReadNextChunk() ) { switch( mnChunkType ) { case PNGCHUNK_IHDR : { - mbStatus = ImplReadHeader( rPreviewSizeHint ); + mbStatus = false; //IHDR should only appear as the first chunk } break; @@ -756,14 +766,17 @@ sal_Bool PNGReaderImpl::ImplReadTransparent() { if ( mnChunkLen <= 256 ) { + mbTransparent = true; mpTransTab = new sal_uInt8 [ 256 ]; rtl_fillMemory( mpTransTab, 256, 0xff ); - rtl_copyMemory( mpTransTab, &(*maDataIter), mnChunkLen ); - maDataIter += mnChunkLen; - mbTransparent = true; - // need alpha transparency if not on/off masking - for( int i = 0; i < mnChunkLen; ++i ) - bNeedAlpha |= (mpTransTab[i]!=0x00) && (mpTransTab[i]!=0xFF); + if (mnChunkLen > 0) + { + rtl_copyMemory( mpTransTab, &(*maDataIter), mnChunkLen ); + maDataIter += mnChunkLen; + // need alpha transparency if not on/off masking + for( int i = 0; i < mnChunkLen; ++i ) + bNeedAlpha |= (mpTransTab[i]!=0x00) && (mpTransTab[i]!=0xFF); + } } } break; |