]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagtiff.cpp
fixed wxXmlDocument::Save() to interpret the indentstep argument correctly
[wxWidgets.git] / src / common / imagtiff.cpp
index fed6679246e0c79b02b03c8c8a541b8bfc165f38..0e90db2a5f0a7d9a53385376b46cfa0dedb45d92 100644 (file)
@@ -126,7 +126,7 @@ static toff_t wxFileOffsetToTIFF(wxFileOffset ofs)
 
     toff_t tofs = wx_truncate_cast(toff_t, ofs);
     wxCHECK_MSG( (wxFileOffset)tofs == ofs, (toff_t)-1,
-                    _T("TIFF library doesn't support large files") );
+                    wxT("TIFF library doesn't support large files") );
 
     return tofs;
 }
@@ -270,7 +270,9 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     if (!tif)
     {
         if (verbose)
+        {
             wxLogError( _("TIFF: Error loading image.") );
+        }
 
         return false;
     }
@@ -278,7 +280,9 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     if (!TIFFSetDirectory( tif, (tdir_t)index ))
     {
         if (verbose)
+        {
             wxLogError( _("Invalid TIFF image index.") );
+        }
 
         TIFFClose( tif );
 
@@ -286,7 +290,6 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     }
 
     uint32 w, h;
-    uint32 npixels;
     uint32 *raster;
 
     TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &w );
@@ -300,14 +303,29 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
                            (samplesInfo[0] == EXTRASAMPLE_ASSOCALPHA ||
                             samplesInfo[0] == EXTRASAMPLE_UNASSALPHA));
 
-    npixels = w * h;
+    // guard against integer overflow during multiplication which could result
+    // in allocating a too small buffer and then overflowing it
+    const double bytesNeeded = (double)w * (double)h * sizeof(uint32);
+    if ( bytesNeeded >= wxUINT32_MAX )
+    {
+        if ( verbose )
+        {
+            wxLogError( _("TIFF: Image size is abnormally big.") );
+        }
+
+        TIFFClose(tif);
+
+        return false;
+    }
 
-    raster = (uint32*) _TIFFmalloc( npixels * sizeof(uint32) );
+    raster = (uint32*) _TIFFmalloc( (uint32)bytesNeeded );
 
     if (!raster)
     {
         if (verbose)
+        {
             wxLogError( _("TIFF: Couldn't allocate memory.") );
+        }
 
         TIFFClose( tif );
 
@@ -318,7 +336,9 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     if (!image->Ok())
     {
         if (verbose)
+        {
             wxLogError( _("TIFF: Couldn't allocate memory.") );
+        }
 
         _TIFFfree( raster );
         TIFFClose( tif );
@@ -332,7 +352,9 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     if (!TIFFReadRGBAImage( tif, w, h, raster, 0 ))
     {
         if (verbose)
+        {
             wxLogError( _("TIFF: Error reading image.") );
+        }
 
         _TIFFfree( raster );
         image->Destroy();
@@ -426,7 +448,7 @@ int wxTIFFHandler::DoGetImageCount( wxInputStream& stream )
     } while (TIFFReadDirectory(tif));
 
     TIFFClose( tif );
-    
+
     // NOTE: this function modifies the current stream position but it's ok
     //       (see wxImageHandler::GetImageCount)
 
@@ -440,7 +462,9 @@ bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbo
     if (!tif)
     {
         if (verbose)
+        {
             wxLogError( _("TIFF: Error saving image.") );
+        }
 
         return false;
     }
@@ -458,7 +482,7 @@ bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbo
     switch ( res )
     {
         default:
-            wxFAIL_MSG( _T("unknown image resolution units") );
+            wxFAIL_MSG( wxT("unknown image resolution units") );
             // fall through
 
         case wxIMAGE_RESOLUTION_NONE:
@@ -520,7 +544,9 @@ bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbo
         if (!buf)
         {
             if (verbose)
+            {
                 wxLogError( _("TIFF: Couldn't allocate memory.") );
+            }
 
             TIFFClose( tif );
 
@@ -566,7 +592,9 @@ bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbo
         if ( TIFFWriteScanline(tif, buf ? buf : ptr, (uint32)row, 0) < 0 )
         {
             if (verbose)
+            {
                 wxLogError( _("TIFF: Error writing image.") );
+            }
 
             TIFFClose( tif );
             if (buf)