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

List:       graphicsmagick-commit
Subject:    [GM-commit] GraphicsMagick: 3 new changesets
From:       GraphicsMagick Commits <graphicsmagick-commit () lists ! sourceforge ! net>
Date:       2021-12-26 1:13:43
Message-ID: mailman.44020.1640481235.2008.graphicsmagick-commit () lists ! sourceforge ! net
[Download RAW message or body]

changeset 083c790c4850 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=083c790c4850
summary: PNG: Support the define png:chunk-malloc-max=limit in order to adjust libpng's chunk size limit.

changeset a9da84c341f5 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=a9da84c341f5
summary: JP2: Fix recently added memory leak pertaining to options

changeset ba930c1fc380 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=ba930c1fc380
summary: JPEG: Implement more efficient way to append JPEG profile chunks.

diffstat:

 ChangeLog                              |    22 +
 VisualMagick/installer/inc/version.isx |     4 +-
 coders/jp2.c                           |     2 +
 coders/jpeg.c                          |   104 +-
 coders/png.c                           |    30 +-
 doc/options.imdoc                      |    10 +
 magick/profile.h                       |     2 +-
 magick/version.h                       |     4 +-
 utilities/gm.1                         |  3286 ++++++++++++++++---------------
 www/Changelog.html                     |    19 +
 www/GraphicsMagick.html                |    23 +-
 www/animate.html                       |    14 +-
 www/batch.html                         |     4 +-
 www/benchmark.html                     |     4 +-
 www/compare.html                       |     4 +-
 www/composite.html                     |     4 +-
 www/conjure.html                       |     4 +-
 www/convert.html                       |     6 +-
 www/display.html                       |    48 +-
 www/gm.html                            |   125 +-
 www/identify.html                      |     4 +-
 www/import.html                        |     4 +-
 www/mogrify.html                       |     6 +-
 www/montage.html                       |     8 +-
 www/time.html                          |     4 +-
 www/version.html                       |     4 +-
 26 files changed, 1970 insertions(+), 1779 deletions(-)

diffs (truncated from 10092 to 500 lines):

diff -r 3c58991d3b9b -r ba930c1fc380 ChangeLog
--- a/ChangeLog	Fri Dec 24 17:28:54 2021 -0600
+++ b/ChangeLog	Sat Dec 25 19:10:32 2021 -0600
@@ -1,3 +1,25 @@
+2021-12-25  Bob Friesenhahn  <bfriesen@simple.dallas.tx.us>
+
+        * magick/profile.c (AppendImageProfile): Deprecate this function
+        since JPEG was the last user.
+
+        * coders/jpeg.c (AppendProfile): Implement more efficient way to
+        append JPEG profile chunks.  Addresses SourceForge issue #634
+        "Slow to read JPEG with big APP1 profile".
+
+        * coders/jp2.c (ReadJP2Image): Free 'options' which is now
+        allocated memory.
+
+        * coders/png.c (ReadOnePNGImage): Support the define
+        png:chunk-malloc-max=limit in order to allow reading PNG files
+        which report "chunk data is too large" or to reduce the default
+        limit.  The default libpng limit is 8,000,000 bytes, which is more
+        than sufficient for normal files.  Note that since PNG uses
+        compression, the limit is on the uncompressed data and a
+        relatively small file may be able to provide a chunk which
+        decompresses to a large size.  Addresses SourceForge #594 "Be able
+        to affect libpng user_chunk_malloc_max".
+
 2021-12-24  Bob Friesenhahn  <bfriesen@simple.dallas.tx.us>
 
         * PerlMagick/Magick.xs: Fix issue that image fill attribute had
diff -r 3c58991d3b9b -r ba930c1fc380 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Fri Dec 24 17:28:54 2021 -0600
+++ b/VisualMagick/installer/inc/version.isx	Sat Dec 25 19:10:32 2021 -0600
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020211224"
-#define public MagickPackageReleaseDate "snapshot-20211224"
+#define public MagickPackageVersionAddendum ".020211225"
+#define public MagickPackageReleaseDate "snapshot-20211225"
diff -r 3c58991d3b9b -r ba930c1fc380 coders/jp2.c
--- a/coders/jp2.c	Fri Dec 24 17:28:54 2021 -0600
+++ b/coders/jp2.c	Sat Dec 25 19:10:32 2021 -0600
@@ -783,6 +783,8 @@
     }
 #endif /* if HAVE_PGX_DECODE */
 
+  MagickFreeMemory(options);
+
   /*
     Using jas_image_decode() makes us subject to Jasper's own format
     determination, which may include file formats we don't want to
diff -r 3c58991d3b9b -r ba930c1fc380 coders/jpeg.c
--- a/coders/jpeg.c	Fri Dec 24 17:28:54 2021 -0600
+++ b/coders/jpeg.c	Sat Dec 25 19:10:32 2021 -0600
@@ -172,6 +172,9 @@
   int
     max_scan_number;
 
+  ProfileInfo
+    profiles[16];
+
   unsigned char
     buffer[65537+200];
 
@@ -204,10 +207,79 @@
 
 static MagickClientData *FreeMagickClientData(MagickClientData *client_data)
 {
+  unsigned int
+    i;
+
+  /* Free profiles data */
+  for (i=0 ; i < ArraySize(client_data->profiles); i++)
+    {
+      MagickFreeMemory(client_data->profiles[i].name);
+      MagickFreeResourceLimitedMemory(client_data->profiles[i].info);
+    }
+
   MagickFreeMemory(client_data);
   return client_data;
 }
 
+/* Append named profile to profiles in client data. */
+static MagickPassFail
+AppendProfile(MagickClientData *client_data,
+              const char *name,
+              const unsigned char *profile_chunk,
+              const size_t chunk_length)
+{
+  unsigned int
+    i;
+
+  /*
+    If entry with matching name is found, then add/append data to
+    profile 'info' and update profile length
+  */
+  for (i=0 ; i < ArraySize(client_data->profiles); i++)
+    {
+      ProfileInfo *profile=&client_data->profiles[i];
+      if (!profile->name)
+        break;
+      if (strcmp(profile->name,name) == 0)
+        {
+          const size_t new_length = profile->length+chunk_length;
+          unsigned char *info = MagickReallocateResourceLimitedMemory(unsigned char *,
+                                                                      profile->info,new_length);
+          if (info != (unsigned char *) NULL)
+            {
+              profile->info = info;
+              (void) memcpy(profile->info+profile->length,profile_chunk,chunk_length);
+              profile->length=new_length;
+              return MagickPass;
+            }
+        }
+    }
+
+
+  /*
+    If no matching entry, then find unallocated entry, add data to
+     profile 'info' and update profile length
+  */
+  for (i=0 ; i < ArraySize(client_data->profiles); i++)
+    {
+      ProfileInfo *profile=&client_data->profiles[i];
+      if (profile->name)
+        continue;
+      profile->name=AcquireString(name);
+      profile->info=MagickAllocateResourceLimitedMemory(unsigned char*,chunk_length);
+      if (!profile->name || !profile->info)
+        {
+          MagickFreeMemory(profile->name);
+          MagickFreeResourceLimitedMemory(profile->info);
+          break;
+        }
+      (void) memcpy(profile->info,profile_chunk,chunk_length);
+      profile->length=chunk_length;
+      return MagickPass;
+    }
+  return MagickFail;
+}
+
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -533,9 +605,6 @@
   MagickClientData
     *client_data;
 
-  Image
-    *image;
-
   size_t
     header_length=0,
     length;
@@ -588,7 +657,6 @@
     Obtain Image.
   */
   client_data=(MagickClientData *) jpeg_info->client_data;
-  image=client_data->image;
 
   /*
     Copy profile from JPEG to allocated memory.
@@ -627,7 +695,7 @@
   /*
     Store profile in Image.
   */
-  (void) AppendImageProfile(image,profile_name,profile+header_length,
+  (void) AppendProfile(client_data,profile_name,profile+header_length,
                             length-header_length);
 
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
@@ -647,9 +715,6 @@
   MagickClientData
     *client_data;
 
-  Image
-    *image;
-
   unsigned char
     *profile;
 
@@ -688,7 +753,6 @@
   (void) GetCharacter(jpeg_info);  /* markers */
   length-=14;
   client_data=(MagickClientData *) jpeg_info->client_data;
-  image=client_data->image;
 
   /*
     Read color profile.
@@ -707,7 +771,7 @@
         break;
     }
   if (i == length)
-    (void) AppendImageProfile(image,"ICM",profile,length);
+    (void) AppendProfile(client_data,"ICM",profile,length);
 
   return(True);
 }
@@ -816,7 +880,7 @@
         break;
     }
   if (i == length)
-    (void) AppendImageProfile(image,"IPTC",profile,length);
+    (void) AppendProfile(client_data,"IPTC",profile,length);
 
   return(True);
 }
@@ -1177,7 +1241,7 @@
   const char
     *value;
 
-  register long
+  register unsigned long
     i;
 
   struct jpeg_error_mgr
@@ -1769,6 +1833,22 @@
     }
   jpeg_destroy_decompress(&jpeg_info);
   MagickFreeResourceLimitedMemory(jpeg_pixels);
+
+  /*
+    Store profiles in image.
+  */
+  for (i=0 ; i < ArraySize(client_data->profiles); i++)
+    {
+      ProfileInfo *profile=&client_data->profiles[i];
+      if (!profile->name)
+        continue;
+      if (!profile->length)
+        continue;
+      if (!profile->info)
+        continue;
+      (void) SetImageProfile(image,profile->name,profile->info,profile->length);
+    }
+
   client_data=FreeMagickClientData(client_data);
   CloseBlob(image);
 
diff -r 3c58991d3b9b -r ba930c1fc380 coders/png.c
--- a/coders/png.c	Fri Dec 24 17:28:54 2021 -0600
+++ b/coders/png.c	Sat Dec 25 19:10:32 2021 -0600
@@ -1656,13 +1656,39 @@
   png_set_benign_errors(ping, 1);
 #endif
 
-  /* Just use libpng's limit (PNG_USER_CHUNK_MALLOC_MAX == 8000000) on
-     chunk size */
+  /* Default to using libpng's limit (PNG_USER_CHUNK_MALLOC_MAX ==
+     8000000) on chunk size */
 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
   /* Reject images with too many rows or columns */
   png_set_user_limits(ping,
     (png_uint_32) Min(0x7fffffffL, GetMagickResourceLimit(WidthResource)),
     (png_uint_32) Min(0x7fffffffL, GetMagickResourceLimit(HeightResource)));
+  /* Allow specifying a different chunk size limit than the
+     PNG_USER_CHUNK_MALLOC_MAX baked into libpng */
+# if PNG_LIBPNG_VER >= 10401 /* png_set_chunk_malloc_max was added in 1.4.1 */
+  {
+    const char *chunk_malloc_max_str;
+    if ((chunk_malloc_max_str=AccessDefinition(image_info,"png","chunk-malloc-max")))
+      {
+        unsigned long chunk_malloc_max;
+        if (MagickAtoULChk(chunk_malloc_max_str, &chunk_malloc_max) == MagickPass)
+          {
+            png_set_chunk_malloc_max(ping, chunk_malloc_max);
+            if (logging)
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                    "Set PNG chunk-malloc-max to %lu bytes",
+                                    chunk_malloc_max);
+          }
+        else
+          {
+            if (logging)
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                    "Failed to parse chunk-malloc-max value \"%s\"",
+                                    chunk_malloc_max_str);
+          }
+      }
+  }
+# endif
 #endif /* PNG_SET_USER_LIMITS_SUPPORTED */
 
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
diff -r 3c58991d3b9b -r ba930c1fc380 doc/options.imdoc
--- a/doc/options.imdoc	Fri Dec 24 17:28:54 2021 -0600
+++ b/doc/options.imdoc	Sat Dec 25 19:10:32 2021 -0600
@@ -1258,6 +1258,16 @@
 requested to scale the image to fit the page size (width and/or
 height).</dd>
 
+<dt>png:chunk-malloc-max=<value></dt>
+<dd>png:chunk-malloc-max specifies the maximum chunk size that libpng
+will be allowed to read.  Libpng's default is normally 8,000,000
+bytes. Very rarely, a valid PNG file may be encountered where the
+error is reported "chunk data is too large".  In this case, the limit
+may be increased using this option.  Take care when increasing this
+limit since an excessively large limit could allow untrusted files to
+use excessive memory.
+</dd>
+
 <dt>mng:maximum-loops=<value></dt>
 <dd>mng:maximum-loops specifies the maximum number of loops allowed to
 be specified by a MNG LOOP chunk. Without an imposed limit, a MNG file
diff -r 3c58991d3b9b -r ba930c1fc380 magick/profile.h
--- a/magick/profile.h	Fri Dec 24 17:28:54 2021 -0600
+++ b/magick/profile.h	Sat Dec 25 19:10:32 2021 -0600
@@ -46,7 +46,7 @@
   extern MagickExport MagickPassFail
   AppendImageProfile(Image *image,const char *name,
                      const unsigned char *profile_chunk,
-                     const size_t chunk_length);
+                     const size_t chunk_length) MAGICK_FUNC_DEPRECATED;
 
 /*
   Generic iterator for traversing profiles.
diff -r 3c58991d3b9b -r ba930c1fc380 magick/version.h
--- a/magick/version.h	Fri Dec 24 17:28:54 2021 -0600
+++ b/magick/version.h	Sat Dec 25 19:10:32 2021 -0600
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x262300
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 26,23,0
-#define MagickChangeDate   "20211224"
-#define MagickReleaseDate  "snapshot-20211224"
+#define MagickChangeDate   "20211225"
+#define MagickReleaseDate  "snapshot-20211225"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 3c58991d3b9b -r ba930c1fc380 utilities/gm.1
--- a/utilities/gm.1	Fri Dec 24 17:28:54 2021 -0600
+++ b/utilities/gm.1	Sat Dec 25 19:10:32 2021 -0600
@@ -1,68 +1,68 @@
-.TH gm 1 "2021/01/29" "GraphicsMagick"
+.TH gm 1 "2021/12/25" "GraphicsMagick"
 .TP
 .in 15
 .in 15
 .in 20
 .SH NAME
-
+\'
 gm - command-line utility to create, edit, compare, convert, or display images
-
+\'
 .SH SYNOPSIS
-
+\'
 \fBgm animate\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIfile\fP \fB[ [\fP
 \fIoptions ...\fP \fB]\fP \fIfile ...\fP \fB]\fP
-
+\'
 \fBgm batch\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fB[\fP \fIscript\fP \fB]\fP
-
+\'
 \fBgm benchmark\fP \fB[\fP \fIoptions ...\fP \fB]\fP subcommand
-
+\'
 \fBgm compare\fP \fB[\fP \fIoptions\fP \fB... ]\fP \fIreference-image\fP
 \fB[\fP \fIoptions\fP \fB... ]\fP \fIcompare-image\fP
 \fB[\fP \fIoptions\fP \fB... ]\fP
-
+\'
 \fBgm composite\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIchange-image base-image\fP
 \fB[\fP \fImask-image\fP \fB]\fP \fIoutput-image\fP
-
+\'
 \fBgm conjure\fP \fB[\fP \fIoptions\fP \fB]\fP \fIscript.msl\fP
 \fB[ [\fP \fIoptions\fP \fB]\fP \fIscript.msl\fP \fB]\fP
-
+\'
 \fBgm convert\fP \fB[ [\fP \fIoptions ...\fP \fB] [\fP \fIinput-file ...\fP
 \fB] [\fP \fIoptions ...\fP \fB] ]\fP \fIoutput-file\fP 
-
+\'
 \fBgm display\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIfile ...\fP
 \fB[ [\fP\fIoptions ...\fP \fB]\fP\fIfile ...\fP \fB]\fP
-
+\'
 \fBgm identify\fP \fIfile\fP \fB[\fP \fIfile ...\fP \fB]\fP
-
+\'
 \fBgm import\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIfile\fP
-
+\'
 \fBgm mogrify\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIfile ...\fP
-
+\'
 \fBgm montage\fP \fB[\fP \fIoptions ...\fP \fB]\fP \fIfile\fP \fB[ [\fP
 \fIoptions ...\fP \fB]\fP \fIfile ...\fP \fB]\fP \fIoutput-file\fP
-
+\'
 \fBgm time\fP subcommand
-
+\'
 \fBgm version\fP
 .SH DESCRIPTION
-
+\'
 GraphicsMagick's \fBgm\fP provides a suite of utilities for creating,
 comparing, converting, editing, and displaying images.  All of the
 utilities are provided as sub-commands of a single \fBgm\fP
 executable.  The \fBgm\fP executable returns the exit code 0 to
 indicate success, or 1 to indicate failure:
-
+\'
 \fBanimate\fP
 displays an animation (e.g. a GIF file) on any workstation display
 running an \fIX\fP server.
-
+\'
 \fBbatch\fP
 executes an arbitary number of the utility commands
 (e.g. \fBconvert\fP) in the form of a simple linear batch script in
 order to improve execution efficiency, and/or to allow use as a
 subordinate co-process under the control of an arbitrary script or
 program.
-
+\'
 \fBbenchmark\fP
 executes one of the other utility commands (e.g. \fBconvert\fP) for a
 specified number of iterations, or execution time, and reports
@@ -70,63 +70,63 @@
 utilization. \fBBenchmark\fP provides various operating modes
 including executing the command with a varying number of threads, and
 alternate reporting formats such as comma-separated value (CSV).
-
+\'
 \fBcompare\fP
 compares two images and reports difference statistics according to
 specified metrics and/or outputs an image with a visual representation
 of the differences.  It may also be used to test if images are similar
 within a particular range and specified metric, returning a truth
 value to the executing environment.
-
+\'
 \fBcomposite\fP
 composites images (blends or merges images together) to create new images.
-
+\'
 \fBconjure\fP
 interprets and executes scripts in
 the Magick Scripting Language (MSL).
-
+\'
 \fBconvert\fP
 converts an input file using one image format to an output file with
 the same or differing image format while applying an arbitrary number
 of image transformations.
-
+\'
 \fBdisplay\fP
 is a machine architecture independent image processing and display
 facility. It can display an image on any workstation display running
 an \fIX\fP server.
-
+\'
 \fBidentify\fP
 describes the format and characteristics of one or more image
 files. It will also report if an image is incomplete or corrupt.
-
+\'
 \fBimport\fP
 reads an image from any visible window on an \fIX\fP server and
 outputs it as an image file. You can capture a single window, the
 entire screen, or any rectangular portion of the screen.
-
+\'
 \fBmogrify\fP
 transforms an image or a sequence of images. These transforms include
 \fBimage scaling\fP, \fBimage rotation\fP, \fBcolor reduction\fP,
 and others. The transmogrified image \fBoverwrites\fP the original
 image.
-
+\'
 \fBmontage\fP
 creates a composite by combining several separate images. The images
 are tiled on the composite image with the name of the image optionally
 appearing just below the individual tile.
-
+\'
 \fBtime\fP
 executes a subcommand and reports the user, system, and total
 execution time consumed.
-
+\'
 \fBversion\fP
 reports the GraphicsMagick release version, maximum sample-depth,
 copyright notice, supported features, and the options used while
 building the software.
-
+\'
 The \fBGraphicsMagick\fP utilities recognize the following image formats:
-
-
+\'
+\'
 \fBName\fP  \fBMode\fP \fBDescription\fP


_______________________________________________
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