[prev in list] [next in list] [prev in thread] [next in thread] 

List:       graphicsmagick-commit
Subject:    [GM-commit] GraphicsMagick: coders/bmp.c First attempt to read BMP with BI_J...
From:       GraphicsMagick Commits <graphicsmagick-commit () lists ! sourceforge ! net>
Date:       2023-08-28 22:03:05
Message-ID: mailman.12619.1693260193.8047.graphicsmagick-commit () lists ! sourceforge ! net
[Download RAW message or body]

changeset c63acce1dd43 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=c63acce1dd43
summary: coders/bmp.c First attempt to read BMP with BI_JPEG compression inside.

diffstat:

 ChangeLog    |    5 ++
 coders/bmp.c |  123 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 110 insertions(+), 18 deletions(-)

diffs (166 lines):

diff -r bff21c747720 -r c63acce1dd43 ChangeLog
--- a/ChangeLog	Mon Aug 28 10:08:34 2023 -0500
+++ b/ChangeLog	Tue Aug 29 00:02:41 2023 +0200
@@ -1,3 +1,8 @@
+2023-08-29  Fojtik Jaroslav  <JaFojtik@yandex.com>
+
+	* coders/bmp.c First attempt to read BMP with BI_JPEG compression 
+	inside.
+
 2023-08-28  Fojtik Jaroslav  <JaFojtik@yandex.com>
 
 	* coders/bmp.c Remove code duplicity and evaluate BiCompression
diff -r bff21c747720 -r c63acce1dd43 coders/bmp.c
--- a/coders/bmp.c	Mon Aug 28 10:08:34 2023 -0500
+++ b/coders/bmp.c	Tue Aug 29 00:02:41 2023 +0200
@@ -527,6 +527,74 @@
   return "UNKNOWN";
 }
 
+
+static Image *ExtractBlobJPG(Image * image, const ImageInfo * image_info, ExceptionInfo * exception)
+{
+  size_t
+    alloc_size;
+  unsigned char
+    *blob;
+
+  alloc_size = GetBlobSize(image) - TellBlob(image);
+
+  if(alloc_size > 0 &&
+     (blob = MagickAllocateResourceLimitedMemory(unsigned char *,alloc_size)) != NULL)
+  {
+      /* Copy JPG to memory blob */
+     if(ReadBlob(image,alloc_size,blob) == alloc_size)
+     {
+        Image *image2;
+        ImageInfo *clone_info;
+
+        //FILE *F = fopen("o:\\temp\\27\\pokus.jpg","wb");
+        //if(F) {fwrite(blob,alloc_size,1,F);fclose(F);}
+
+        clone_info = CloneImageInfo(image_info);
+
+              /* BlobToFile("/tmp/jnx-tile.jpg", blob,alloc_size,exception); */
+
+         (void) strlcpy(clone_info->filename,"JPEG:",sizeof(clone_info->filename));
+         if ((image2 = BlobToImage(clone_info,blob,alloc_size,exception))
+                  != NULL)
+         {
+                  /*
+                    Replace current image with new image while copying
+                    base image attributes.
+                  */
+                  (void) strlcpy(image2->filename, image->filename,
+                                 sizeof(image2->filename));
+                  (void) strlcpy(image2->magick_filename, image->magick_filename,
+                                 sizeof(image2->magick_filename));
+                  (void) strlcpy(image2->magick, image->magick,
+                                 sizeof(image2->magick));
+                  DestroyBlob(image2);
+                  image2->blob = ReferenceBlob(image->blob);
+
+                  if ((image->rows == 0) || (image->columns == 0))
+                    DeleteImageFromList(&image);
+
+                  AppendImageToList(&image, image2);
+         }
+         DestroyImageInfo(clone_info);
+         clone_info = (ImageInfo *) NULL;
+         MagickFreeResourceLimitedMemory(blob);
+      }
+      else
+      {
+        MagickFreeResourceLimitedMemory(blob);
+              /* Failed to read enough data from input */
+        ThrowException(exception,CorruptImageError,UnexpectedEndOfFile, image->filename);
+      }
+  }
+  else
+  {
+      /* Failed to allocate memory */
+      ThrowException(exception,ResourceLimitError,MemoryAllocationFailed,
+                     image->filename);
+  }
+  return(image);
+}
+
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1047,6 +1115,41 @@
         ThrowBMPReaderException(CorruptImageError,NegativeOrZeroImageSize,image);
       if ((bmp_info.height < 0) && (bmp_info.compression !=0))
         ThrowBMPReaderException(CorruptImageError,CompressionNotValid,image);
+      // J.Fojtik - TEST IS DUPLICATED, PLEASE REMOVE!
+      //if (bmp_info.compression>BI_BITFIELDS && bmp_info.compression!=BI_ALPHABITFIELDS)
+      //  ThrowBMPReaderException(CorruptImageError,UnrecognizedImageCompression,image);
+      switch ((unsigned int) bmp_info.compression)
+        {
+        case BI_RGB:
+        case BI_RLE8:
+        case BI_RLE4:
+        case BI_BITFIELDS:
+        case BI_ALPHABITFIELDS:
+          break;
+        case BI_JPEG:
+          offset = start_position + 14 + bmp_info.size;
+          if(logging)
+              (void)LogMagickEvent(CoderEvent,GetMagickModule(),
+                                  "Seek offset %" MAGICK_OFF_F "d",
+                                  (magick_off_t) offset);
+          if((offset < start_position) ||
+              (SeekBlob(image,offset,SEEK_SET) != (magick_off_t) offset))
+              ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
+          {
+            MonitorHandler previous_handler;
+            previous_handler = SetMonitorHandler(0);
+            image = ExtractBlobJPG(image, image_info, exception);
+            (void) SetMonitorHandler(previous_handler);
+            if (exception->severity >= ErrorException)
+                ThrowBMPReaderException(CoderError,JPEGCompressionNotSupported,image)
+          }
+          goto ExitLoop;	/* I need to break a loop. Other BMPs in a chain are ignorred. */
+        case BI_PNG:
+          ThrowBMPReaderException(CoderError,PNGCompressionNotSupported,image)
+        default:
+          ThrowBMPReaderException(CorruptImageError,UnrecognizedImageCompression,image)
+        }
+
       if (bmp_info.planes != 1)
         ThrowBMPReaderException(CorruptImageError,StaticPlanesValueNotEqualToOne,
                                 image);
@@ -1065,24 +1168,7 @@
         ThrowBMPReaderException(CorruptImageError,UnrecognizedBitsPerPixel,image);
       if ((bmp_info.compression == 3) && (bmp_info.bits_per_pixel < 16))
         ThrowBMPReaderException(CorruptImageError,UnrecognizedBitsPerPixel,image);
-      // J.Fojtik - TEST IS DUPLICATED, PLEASE REMOVE!
-      //if (bmp_info.compression>BI_BITFIELDS && bmp_info.compression!=BI_ALPHABITFIELDS)
-      //  ThrowBMPReaderException(CorruptImageError,UnrecognizedImageCompression,image);
-      switch ((unsigned int) bmp_info.compression)
-        {
-        case BI_RGB:
-        case BI_RLE8:
-        case BI_RLE4:
-        case BI_BITFIELDS:
-        case BI_ALPHABITFIELDS:
-          break;
-        case BI_JPEG:
-          ThrowBMPReaderException(CoderError,JPEGCompressionNotSupported,image)
-        case BI_PNG:
-          ThrowBMPReaderException(CoderError,PNGCompressionNotSupported,image)
-        default:
-          ThrowBMPReaderException(CorruptImageError,UnrecognizedImageCompression,image)
-            }
+
       image->columns=bmp_info.width;
       image->rows=AbsoluteValue(bmp_info.height);
       image->depth=8;
@@ -1691,6 +1777,7 @@
             break;
         }
     } while (IsBMP(magick,2));
+ExitLoop:
   while (image->previous != (Image *) NULL)
     image=image->previous;
   CloseBlob(image);


_______________________________________________
Graphicsmagick-commit mailing list
Graphicsmagick-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/graphicsmagick-commit
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic