GraphicsMagick: JPEG FormatJPEGSamplingFactors(): Properly handl...

GraphicsMagick Commits <[email protected]> Sat, 01 Jun 2024 08:50:57 -0500
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.8114.1717249873.7906.graphicsmagick-commit@lists.sourceforge.net>
changeset 5488b5300b26 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=5488b5300b26
summary: JPEG FormatJPEGSamplingFactors(): Properly handle the number of samples for each colorspace.

diffstat:

 ChangeLog                              |    7 +
 VisualMagick/installer/inc/version.isx |    4 +-
 coders/jpeg.c                          |  171 +++++++++++++++++++++++---------
 magick/version.h                       |    4 +-
 www/ChangeLog.html                     |    9 +
 5 files changed, 143 insertions(+), 52 deletions(-)

diffs (254 lines):

diff -r 5e5f228181f4 -r 5488b5300b26 ChangeLog
--- a/ChangeLog	Sun May 26 11:20:06 2024 -0500
+++ b/ChangeLog	Sat Jun 01 08:49:41 2024 -0500
@@ -1,3 +1,10 @@
+2024-06-01  Bob Friesenhahn  <[email protected]>
+
+	* coders/jpeg.c (FormatJPEGSamplingFactors): Properly handle the
+	number of samples for each colorspace. Addresses oss-fuzz 68737:
+	"graphicsmagick:coder_DCM_fuzzer: Use-of-uninitialized-value in
+	ReadJPEGImage".
+
 2024-05-26  Fojtik Jaroslav  <[email protected]>
 
 	* coders/tga.c: Set affinity of UndefinedOrientation to
diff -r 5e5f228181f4 -r 5488b5300b26 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Sun May 26 11:20:06 2024 -0500
+++ b/VisualMagick/installer/inc/version.isx	Sat Jun 01 08:49:41 2024 -0500
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020240526"
-#define public MagickPackageReleaseDate "snapshot-20240526"
+#define public MagickPackageVersionAddendum ".020240601"
+#define public MagickPackageReleaseDate "snapshot-20240601"
diff -r 5e5f228181f4 -r 5488b5300b26 coders/jpeg.c
--- a/coders/jpeg.c	Sun May 26 11:20:06 2024 -0500
+++ b/coders/jpeg.c	Sat Jun 01 08:49:41 2024 -0500
@@ -1173,57 +1173,130 @@
 /*
   Format JPEG sampling factors to a string.
 */
-static void
+static MagickPassFail
 FormatJPEGSamplingFactors(const struct jpeg_decompress_struct *jpeg_info,
                           char *sampling_factors)
 {
+  unsigned int
+    quantums = 0;
+
+  MagickPassFail
+    status = MagickFail;
+
   switch (jpeg_info->out_color_space)
     {
-    case JCS_CMYK:
-      {
-        (void) FormatString(sampling_factors,"%dx%d,%dx%d,%dx%d,%dx%d",
-                            jpeg_info->comp_info[0].h_samp_factor,
-                            jpeg_info->comp_info[0].v_samp_factor,
-                            jpeg_info->comp_info[1].h_samp_factor,
-                            jpeg_info->comp_info[1].v_samp_factor,
-                            jpeg_info->comp_info[2].h_samp_factor,
-                            jpeg_info->comp_info[2].v_samp_factor,
-                            jpeg_info->comp_info[3].h_samp_factor,
-                            jpeg_info->comp_info[3].v_samp_factor);
-        break;
-      }
+    default:
+    case JCS_UNKNOWN:
+      /* error/unspecified */
+      break;
     case JCS_GRAYSCALE:
-      {
-        (void) FormatString(sampling_factors,"%dx%d",
-                            jpeg_info->comp_info[0].h_samp_factor,
-                            jpeg_info->comp_info[0].v_samp_factor);
-        break;
-      }
+      /* monochrome */
+      quantums = 1;
+      break;
     case JCS_RGB:
-      {
-        (void) FormatString(sampling_factors,"%dx%d,%dx%d,%dx%d",
-                            jpeg_info->comp_info[0].h_samp_factor,
-                            jpeg_info->comp_info[0].v_samp_factor,
-                            jpeg_info->comp_info[1].h_samp_factor,
-                            jpeg_info->comp_info[1].v_samp_factor,
-                            jpeg_info->comp_info[2].h_samp_factor,
-                            jpeg_info->comp_info[2].v_samp_factor);
-        break;
-      }
-    default:
-      {
-        (void) FormatString(sampling_factors,"%dx%d,%dx%d,%dx%d,%dx%d",
-                            jpeg_info->comp_info[0].h_samp_factor,
-                            jpeg_info->comp_info[0].v_samp_factor,
-                            jpeg_info->comp_info[1].h_samp_factor,
-                            jpeg_info->comp_info[1].v_samp_factor,
-                            jpeg_info->comp_info[2].h_samp_factor,
-                            jpeg_info->comp_info[2].v_samp_factor,
-                            jpeg_info->comp_info[3].h_samp_factor,
-                            jpeg_info->comp_info[3].v_samp_factor);
-        break;
-      }
+      /* red/green/blue as specified by the RGB_RED, RGB_GREEN,
+         RGB_BLUE, and RGB_PIXELSIZE macros */
+      quantums = 3;
+      break;
+    case JCS_YCbCr:
+      /* Y/Cb/Cr (also known as YUV) */
+      quantums = 3;
+      break;
+    case JCS_CMYK:
+      /* C/M/Y/K */
+      quantums = 4;
+      break;
+    case JCS_YCCK:
+      /* Y/Cb/Cr/K */
+      quantums = 4;
+      break;
+#if 0
+#if defined(JCS_EXTENSIONS) && JCS_EXTENSIONS
+    case JCS_EXT_RGB:
+      /* red/green/blue */
+      quantums = 3;
+      break;
+    case JCS_EXT_RGBX:
+      /* red/green/blue/x */
+      quantums = 4;
+      break;
+    case JCS_EXT_BGR:
+      /* blue/green/red */
+      quantums = 3;
+      break;
+    case JCS_EXT_BGRX:
+      /* blue/green/red/x */
+      quantums = 4;
+      break;
+    case JCS_EXT_XBGR:
+      /* x/blue/green/red */
+      quantums = 4;
+      break;
+    case JCS_EXT_XRGB:
+      /* x/red/green/blue */
+      quantums = 4;
+      break;
+
+#if defined(JCS_ALPHA_EXTENSIONS) && JCS_ALPHA_EXTENSIONS
+    case JCS_EXT_RGBA:
+      /* red/green/blue/alpha */
+      quantums = 4;
+      break;
+    case JCS_EXT_BGRA:
+      /* blue/green/red/alpha */
+      quantums = 4;
+      break;
+    case JCS_EXT_ABGR:
+      /* alpha/blue/green/red */
+      quantums = 4;
+      break;
+    case JCS_EXT_ARGB:
+      /* alpha/red/green/blue */
+      quantums = 4;
+      break;
+    case JCS_RGB565:
+      /* 5-bit red/6-bit green/5-bit blue [decompression only] */
+      quantums = 3;
+      break;
+#endif /* defined(JCS_ALPHA_EXTENSIONS) && JCS_ALPHA_EXTENSIONS */
+#endif /* if defined(JCS_EXTENSIONS) && JCS_EXTENSIONS */
+#endif
     }
+
+  switch (quantums)
+    {
+    case 0:
+      break;
+    case 1:
+      (void) FormatString(sampling_factors,"%dx%d",
+                          jpeg_info->comp_info[0].h_samp_factor,
+                          jpeg_info->comp_info[0].v_samp_factor);
+      status = MagickPass;
+      break;
+    case 3:
+      (void) FormatString(sampling_factors,"%dx%d,%dx%d,%dx%d",
+                          jpeg_info->comp_info[0].h_samp_factor,
+                          jpeg_info->comp_info[0].v_samp_factor,
+                          jpeg_info->comp_info[1].h_samp_factor,
+                          jpeg_info->comp_info[1].v_samp_factor,
+                          jpeg_info->comp_info[2].h_samp_factor,
+                          jpeg_info->comp_info[2].v_samp_factor);
+      status = MagickPass;
+      break;
+    case 4:
+      (void) FormatString(sampling_factors,"%dx%d,%dx%d,%dx%d,%dx%d",
+                          jpeg_info->comp_info[0].h_samp_factor,
+                          jpeg_info->comp_info[0].v_samp_factor,
+                          jpeg_info->comp_info[1].h_samp_factor,
+                          jpeg_info->comp_info[1].v_samp_factor,
+                          jpeg_info->comp_info[2].h_samp_factor,
+                          jpeg_info->comp_info[2].v_samp_factor,
+                          jpeg_info->comp_info[3].h_samp_factor,
+                          jpeg_info->comp_info[3].v_samp_factor);
+      status = MagickPass;
+      break;
+    }
+  return status;
 }
 
 static MagickBool
@@ -1616,11 +1689,13 @@
                             "Colorspace: %s (%d)", attribute,
                             jpeg_info.out_color_space);
 
-    FormatJPEGSamplingFactors(&jpeg_info,attribute);
-    (void) SetImageAttribute(image,"JPEG-Sampling-factors",attribute);
-    if (image->logging)
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "Sampling Factors: %s", attribute);
+    if (FormatJPEGSamplingFactors(&jpeg_info,attribute) != MagickFail)
+      {
+        (void) SetImageAttribute(image,"JPEG-Sampling-factors",attribute);
+        if (image->logging)
+          (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                "Sampling Factors: %s", attribute);
+      }
   }
 
   image->depth=Min(jpeg_info.data_precision,Min(16,QuantumDepth));
diff -r 5e5f228181f4 -r 5488b5300b26 magick/version.h
--- a/magick/version.h	Sun May 26 11:20:06 2024 -0500
+++ b/magick/version.h	Sat Jun 01 08:49:41 2024 -0500
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x282500
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 28,25,0
-#define MagickChangeDate   "20240526"
-#define MagickReleaseDate  "snapshot-20240526"
+#define MagickChangeDate   "20240601"
+#define MagickReleaseDate  "snapshot-20240601"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 5e5f228181f4 -r 5488b5300b26 www/ChangeLog.html
--- a/www/ChangeLog.html	Sun May 26 11:20:06 2024 -0500
+++ b/www/ChangeLog.html	Sat Jun 01 08:49:41 2024 -0500
@@ -38,6 +38,15 @@
 
 <div class="document" id="graphicsmagick-changelog">
 <h1 class="title">GraphicsMagick ChangeLog</h1>
+<p>2024-06-01  Bob Friesenhahn  &lt;<a class="reference external" href="mailto:bfriesen&#37;&#52;&#48;simple&#46;dallas&#46;tx&#46;us">bfriesen<span>&#64;</span>simple<span>&#46;</span>dallas<span>&#46;</span>tx<span>&#46;</span>us</a>&gt;</p>
+<blockquote>
+<ul class="simple">
+<li><p>coders/jpeg.c (FormatJPEGSamplingFactors): Properly handle the
+number of samples for each colorspace. Addresses oss-fuzz 68737:
+&quot;graphicsmagick:coder_DCM_fuzzer: Use-of-uninitialized-value in
+ReadJPEGImage&quot;.</p></li>
+</ul>
+</blockquote>
 <p>2024-05-26  Fojtik Jaroslav  &lt;<a class="reference external" href="mailto:JaFojtik&#37;&#52;&#48;yandex&#46;com">JaFojtik<span>&#64;</span>yandex<span>&#46;</span>com</a>&gt;</p>
 <blockquote>
 <ul class="simple">