]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 14 Jun 2013 19:48:08 +0000 (19:48 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 14 Jun 2013 19:48:08 +0000 (19:48 +0000)
MagickCore/blob.c
coders/bmp.c

index 06eb37e3e9107445c4973cb58eb969beb242e938..e8d11a1b07de8db7255ed1cddad257d7a9cbcede 100644 (file)
@@ -81,6 +81,9 @@
 #if !defined(MAP_FAILED)
 #define MAP_FAILED  ((void *) -1)
 #endif
+#if !defined(MS_SYNC)
+#define MS_SYNC  0x04
+#endif
 #if defined(__OS2__)
 #include <io.h>
 #define _O_BINARY O_BINARY
@@ -112,9 +115,6 @@ struct _BlobInfo
     extent,
     quantum;
 
-  MapMode
-    mode;
-
   MagickBooleanType
     mapped,
     eof;
@@ -650,7 +650,10 @@ MagickExport void DestroyBlob(Image *image)
     return;
   (void) CloseBlob(image);
   if (image->blob->mapped != MagickFalse)
-    (void) UnmapBlob(image->blob->data,image->blob->length);
+    {
+      (void) UnmapBlob(image->blob->data,image->blob->length);
+      RelinquishMagickResource(MapResource,image->blob->length);
+    }
   if (image->blob->semaphore != (SemaphoreInfo *) NULL)
     DestroySemaphoreInfo(&image->blob->semaphore);
   image->blob->signature=(~MagickSignature);
@@ -688,7 +691,10 @@ MagickExport unsigned char *DetachBlob(BlobInfo *blob_info)
   if (blob_info->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   if (blob_info->mapped != MagickFalse)
-    (void) UnmapBlob(blob_info->data,blob_info->length);
+    {
+      (void) UnmapBlob(blob_info->data,blob_info->length);
+      RelinquishMagickResource(MapResource,blob_info->length);
+    }
   blob_info->mapped=MagickFalse;
   blob_info->length=0;
   blob_info->offset=0;
@@ -2554,6 +2560,9 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
                 ExceptionInfo
                   *sans_exception;
 
+                size_t
+                  length;
+
                 struct stat
                   *properties;
 
@@ -2561,20 +2570,19 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
                 magick_info=GetMagickInfo(image_info->magick,sans_exception);
                 sans_exception=DestroyExceptionInfo(sans_exception);
                 properties=(&image->blob->properties);
+                length=(size_t) properties->st_size;
                 if ((magick_info != (const MagickInfo *) NULL) &&
                     (GetMagickBlobSupport(magick_info) != MagickFalse) &&
-                    (properties->st_size <= MagickMaxBufferExtent))
+                    (AcquireMagickResource(MapResource,length) != MagickFalse))
                   {
-                    size_t
-                      length;
-
                     void
                       *blob;
 
-                    length=(size_t) properties->st_size;
                     blob=MapBlob(fileno(image->blob->file_info.file),ReadMode,
                       0,length);
-                    if (blob != (void *) NULL)
+                    if (blob == (void *) NULL)
+                      RelinquishMagickResource(MapResource,length);
+                    else
                       {
                         /*
                           Format supports blobs-- use memory-mapped I/O.
@@ -2588,7 +2596,6 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
                           }
                         AttachBlob(image->blob,blob,length);
                         image->blob->mapped=MagickTrue;
-                        image->blob->mode=ReadMode;
                       }
                   }
               }
@@ -3791,6 +3798,7 @@ MagickPrivate MagickBooleanType SetBlobExtent(Image *image,
             count;
 
           (void) UnmapBlob(image->blob->data,image->blob->length);
+          RelinquishMagickResource(MapResource,image->blob->length);
           if (extent != (MagickSizeType) ((off_t) extent))
             return(MagickFalse);
           offset=SeekBlob(image,0,SEEK_END);
@@ -3820,7 +3828,7 @@ MagickPrivate MagickBooleanType SetBlobExtent(Image *image,
             image->blob->file_info.file),WriteMode,0,(size_t) extent);
           image->blob->extent=(size_t) extent;
           image->blob->length=(size_t) extent;
-          image->blob->mode=WriteMode;
+          (void) AcquireMagickResource(MapResource,extent);
           (void) SyncBlob(image);
           break;
         }
@@ -3903,9 +3911,8 @@ static int SyncBlob(Image *image)
       break;
     case BlobStream:
     {
-#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && defined(MS_SYNC)
-      if ((image->blob->mapped != MagickFalse) &&
-          ((image->blob->mode == WriteMode) || (image->blob->mode == IOMode)))
+#if defined(MAGICKCORE_HAVE_MMAP_FILEIO)
+      if (image->blob->mapped != MagickFalse)
         status=msync(image->blob->data,image->blob->length,MS_SYNC);
 #endif
       break;
index b2d1e9f204c8b620df55e544bf74167b4db83869..6e66cc5c7ff1101e31e6d1a94f189730898314e6 100644 (file)
@@ -506,6 +506,7 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
     *image;
 
   MagickBooleanType
+    mapped,
     status;
 
   MagickOffsetType
@@ -924,22 +925,34 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
       bmp_info.bits_per_pixel<<=1;
     bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32);
     length=(size_t) bytes_per_line*image->rows;
-    pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows,
-      MagickMax(bytes_per_line,image->columns+256UL)*sizeof(*pixels));
-    if (pixels == (unsigned char *) NULL)
-      ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+    mapped=MagickFalse;
     if ((bmp_info.compression == BI_RGB) ||
         (bmp_info.compression == BI_BITFIELDS))
       {
         if (image->debug != MagickFalse)
           (void) LogMagickEvent(CoderEvent,GetMagickModule(),
             "  Reading pixels (%.20g bytes)",(double) length);
-        count=ReadBlob(image,length,pixels);
-        if (count != (ssize_t) length)
+        if (GetBlobStreamData(image) != (unsigned char *) NULL)
           {
-            pixels=(unsigned char *) RelinquishMagickMemory(pixels);
-            ThrowReaderException(CorruptImageError,
-              "InsufficientImageDataInFile");
+            mapped=MagickTrue;
+            pixels=GetBlobStreamData(image)+TellBlob(image);
+            if (DiscardBlobBytes(image,length) == MagickFalse)
+              ThrowReaderException(CorruptImageError,
+                "InsufficientImageDataInFile");
+          }
+        else
+          {
+            pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows,
+              MagickMax(bytes_per_line,image->columns)*sizeof(*pixels));
+            if (pixels == (unsigned char *) NULL)
+              ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+            count=ReadBlob(image,length,pixels);
+            if (count != (ssize_t) length)
+              {
+                pixels=(unsigned char *) RelinquishMagickMemory(pixels);
+                ThrowReaderException(CorruptImageError,
+                  "InsufficientImageDataInFile");
+              }
           }
       }
     else
@@ -947,6 +960,10 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
         /*
           Convert run-length encoded raster pixels.
         */
+        pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows,
+          MagickMax(bytes_per_line,image->columns+256UL)*sizeof(*pixels));
+        if (pixels == (unsigned char *) NULL)
+          ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
         status=DecodeImage(image,bmp_info.compression,pixels);
         if (status == MagickFalse)
           {
@@ -1146,7 +1163,8 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
         if (bmp_info.compression != BI_RGB &&
             bmp_info.compression != BI_BITFIELDS)
           {
-            pixels=(unsigned char *) RelinquishMagickMemory(pixels);
+            if (mapped == MagickFalse)
+              pixels=(unsigned char *) RelinquishMagickMemory(pixels);
             ThrowReaderException(CorruptImageError,
               "UnrecognizedImageCompression");
           }
@@ -1245,7 +1263,8 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
         if ((bmp_info.compression != BI_RGB) &&
             (bmp_info.compression != BI_BITFIELDS))
           {
-            pixels=(unsigned char *) RelinquishMagickMemory(pixels);
+            if (mapped == MagickFalse)
+              pixels=(unsigned char *) RelinquishMagickMemory(pixels);
             ThrowReaderException(CorruptImageError,
               "UnrecognizedImageCompression");
           }
@@ -1301,11 +1320,13 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception)
       }
       default:
       {
-        pixels=(unsigned char *) RelinquishMagickMemory(pixels);
+        if (mapped == MagickFalse)
+          pixels=(unsigned char *) RelinquishMagickMemory(pixels);
         ThrowReaderException(CorruptImageError,"ImproperImageHeader");
       }
     }
-    pixels=(unsigned char *) RelinquishMagickMemory(pixels);
+    if (mapped == MagickFalse)
+      pixels=(unsigned char *) RelinquishMagickMemory(pixels);
     if (EOFBlob(image) != MagickFalse)
       {
         ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",