Author: damjan
Date: Sat Nov 25 13:21:24 2017
New Revision: 1816295

URL: http://svn.apache.org/viewvc?rev=1816295&view=rev
Log:
Add range checking to PNG palette indexes,
as per OSS-Fuzz issue 574.

Patch by: me


Modified:
    openoffice/trunk/main/vcl/source/gdi/pngread.cxx

Modified: openoffice/trunk/main/vcl/source/gdi/pngread.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/gdi/pngread.cxx?rev=1816295&r1=1816294&r2=1816295&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/source/gdi/pngread.cxx (original)
+++ openoffice/trunk/main/vcl/source/gdi/pngread.cxx Sat Nov 25 13:21:24 2017
@@ -36,6 +36,7 @@
 #include <vcl/svapp.hxx>
 #include <vcl/alpha.hxx>
 #include <osl/endian.h>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
 
 // -----------
 // - Defines -
@@ -296,7 +297,7 @@ bool PNGReaderImpl::ReadNextChunk()
         if( mnChunkLen < 0 )
             return false;
         const sal_Size nStreamPos = mrPNGStream.Tell();
-        if( nStreamPos + mnChunkLen >= mnStreamSize )
+        if( nStreamPos + mnChunkLen + 4 >= mnStreamSize )
             return false;
 
         // calculate chunktype CRC (swap it back to original byte order)
@@ -434,7 +435,16 @@ BitmapEx PNGReaderImpl::GetBitmapEx( con
                                if ( !mpInflateInBuf )  // taking care that the 
header has properly been read
                                        mbStatus = sal_False;
                                else if ( !mbIDAT )             // the gfx is 
finished, but there may be left a zlibCRC of about 4Bytes
-                                       ImplReadIDAT();
+                               {
+                                       try
+                                       {
+                                               ImplReadIDAT();
+                                       }
+                                       catch 
(::com::sun::star::lang::IndexOutOfBoundsException&)
+                                       {
+                                               mbStatus = sal_False;
+                                       }
+                               }
                        }
                        break;
 
@@ -1644,6 +1654,8 @@ void PNGReaderImpl::ImplSetPixel( sal_uI
         return;
     nX >>= mnPreviewShift;
 
+    if (nPalIndex >= mpAcc->GetPaletteEntryCount())
+        throw ::com::sun::star::lang::IndexOutOfBoundsException();
     mpAcc->SetPixelIndex( nY, nX, nPalIndex );
 }
 
@@ -1674,6 +1686,8 @@ void PNGReaderImpl::ImplSetAlphaPixel( s
         return;
     nX >>= mnPreviewShift;
 
+    if (nPalIndex >= mpAcc->GetPaletteEntryCount())
+        throw ::com::sun::star::lang::IndexOutOfBoundsException();
     mpAcc->SetPixelIndex( nY, nX, nPalIndex );
     mpMaskAcc->SetPixelIndex( nY, nX, ~nAlpha );
 }


Reply via email to