GraphicsMagick: Fixes based on Coverity analysis.

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.11467.1648821920.1506.graphicsmagick-commit@lists.sourceforge.net>
changeset 8c5fdda5297d in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=8c5fdda5297d
summary: Fixes based on Coverity analysis.

diffstat:

 ChangeLog                              |  22 ++++++++++++++
 Makefile.am                            |   8 +++--
 Makefile.in                            |   8 +++--
 VisualMagick/installer/inc/version.isx |   4 +-
 coders/jp2.c                           |  25 ++++++++++++----
 magick/error.c                         |  32 ++++++++++++++++----
 magick/gradient.c                      |   8 ++++-
 magick/locale.c                        |   4 +-
 magick/magick_types.h.in               |  51 ++++++++++++++++++++-------------
 magick/render.c                        |   6 ++--
 magick/resize.c                        |   3 +-
 magick/version.h                       |   4 +-
 magick/xwindow.c                       |   9 +++++-
 www/Changelog.html                     |  18 ++++++++++++
 www/Changes.html                       |   2 +-
 www/Changes.rst                        |   2 +-
 www/links.html                         |   7 ++++
 www/links.rst                          |   3 ++
 18 files changed, 163 insertions(+), 53 deletions(-)

diffs (truncated from 525 to 500 lines):

diff -r 230c7f549ba5 -r 8c5fdda5297d ChangeLog
--- a/ChangeLog	Sat Mar 26 13:22:31 2022 -0500
+++ b/ChangeLog	Fri Apr 01 09:04:54 2022 -0500
@@ -1,3 +1,25 @@
+2022-04-01  Bob Friesenhahn  <[email protected]>
+
+        * magick/error.c (ThrowLoggedException): Silence Coverity 376912
+        "Dereference after null check (FORWARD_NULL)".
+
+        * coders/jp2.c (ReadJP2Image): Silence Coverity 264883 "Division
+        or modulo by float zero (DIVIDE_BY_ZERO)".
+        (ReadJP2Image): Fix Coverity 376911 "Improper use of negative
+        value (NEGATIVE_RETURNS)".
+
+        * magick/xwindow.c (MagickXMakeMagnifyImage): Fix Coverity 376906
+        "Division or modulo by zero (DIVIDE_BY_ZERO)".
+
+        * magick/resize.c (ScaleImage): Fix Coverity 376908 "Resource leak
+        (RESOURCE_LEAK)".
+
+        * magick/locale.c (GetLocaleMessageFromTag): Fix Coverity 376907
+        "Out-of-bounds read (OVERRUN)".
+
+        * magick/render.c (DrawPrimitive): Fix Coverity 376904
+        "Out-of-bounds access (OVERRUN)".
+
 2022-03-26  Bob Friesenhahn  <[email protected]>
 
         * version.sh: Prepare for 1.3.38 release.
diff -r 230c7f549ba5 -r 8c5fdda5297d Makefile.am
--- a/Makefile.am	Sat Mar 26 13:22:31 2022 -0500
+++ b/Makefile.am	Fri Apr 01 09:04:54 2022 -0500
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2021 GraphicsMagick Group
+# Copyright (C) 2004-2022 GraphicsMagick Group
 #
 # This program is covered by multiple licenses, which are described in
 # Copyright.txt. You should have received a copy of Copyright.txt with this
@@ -425,12 +425,13 @@
 COVERITY_TARBALL=GraphicsMagick.xz
 COVERITY_VERSION=snapshot-@PACKAGE_CHANGE_DATE@
 COVERITY_DESCRIPTION='Ubuntu Q@QuantumDepth@'
-# New URL is https://brb.synopsys.com/?project=GraphicsMagick
+COVERITY_COV_INT='cov-int'
+# New URL is https://scan.coverity.com/projects/graphicsmagick?tab=overview
 coverity:
 	$(MAKE) clean
 	cov-build --dir cov-int $(MAKE)
 	tar caf $(COVERITY_TARBALL) cov-int
-	curl --limit-rate 50K \
+	curl --limit-rate 34K \
 	--form token=`cat $$HOME/.coverity_key_gm` \
 	--form email=$(COVERITY_EMAIL) \
 	--form file=@$(COVERITY_TARBALL) \
@@ -438,6 +439,7 @@
 	--form description=$(COVERITY_DESCRIPTION) \
 	https://scan.coverity.com/builds?project=GraphicsMagick
 	$(RM) $(COVERITY_TARBALL)
+	$(RM) -rf $(COVERITY_COV_INT)
 
 # Rules for a profiled build (according to Paolo Bonzini <[email protected]>)
 #.PHONY: profile
diff -r 230c7f549ba5 -r 8c5fdda5297d Makefile.in
--- a/Makefile.in	Sat Mar 26 13:22:31 2022 -0500
+++ b/Makefile.in	Fri Apr 01 09:04:54 2022 -0500
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# Copyright (C) 2004-2021 GraphicsMagick Group
+# Copyright (C) 2004-2022 GraphicsMagick Group
 #
 # This program is covered by multiple licenses, which are described in
 # Copyright.txt. You should have received a copy of Copyright.txt with this
@@ -4927,6 +4927,7 @@
 COVERITY_TARBALL = GraphicsMagick.xz
 COVERITY_VERSION = snapshot-@PACKAGE_CHANGE_DATE@
 COVERITY_DESCRIPTION = 'Ubuntu Q@QuantumDepth@'
+COVERITY_COV_INT = 'cov-int'
 
 # Rules for a profiled build (according to Paolo Bonzini <[email protected]>)
 #.PHONY: profile
@@ -11445,12 +11446,12 @@
 @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@	done
 @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@	cp $(top_srcdir)/ChangeLog $(SNAPSHOT_DIRECTORY)/ChangeLog.txt
 @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@	cp $(top_srcdir)/www/Changelog.html $(SNAPSHOT_DIRECTORY)/ChangeLog.html
-# New URL is https://brb.synopsys.com/?project=GraphicsMagick
+# New URL is https://scan.coverity.com/projects/graphicsmagick?tab=overview
 coverity:
 	$(MAKE) clean
 	cov-build --dir cov-int $(MAKE)
 	tar caf $(COVERITY_TARBALL) cov-int
-	curl --limit-rate 50K \
+	curl --limit-rate 34K \
 	--form token=`cat $$HOME/.coverity_key_gm` \
 	--form email=$(COVERITY_EMAIL) \
 	--form file=@$(COVERITY_TARBALL) \
@@ -11458,6 +11459,7 @@
 	--form description=$(COVERITY_DESCRIPTION) \
 	https://scan.coverity.com/builds?project=GraphicsMagick
 	$(RM) $(COVERITY_TARBALL)
+	$(RM) -rf $(COVERITY_COV_INT)
 
 # Build symbols files to add 'gm' prefix to functions
 gmsymbols:
diff -r 230c7f549ba5 -r 8c5fdda5297d VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Sat Mar 26 13:22:31 2022 -0500
+++ b/VisualMagick/installer/inc/version.isx	Fri Apr 01 09:04:54 2022 -0500
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020220326"
-#define public MagickPackageReleaseDate "snapshot-20220326"
+#define public MagickPackageVersionAddendum ".020220401"
+#define public MagickPackageReleaseDate "snapshot-20220401"
diff -r 230c7f549ba5 -r 8c5fdda5297d coders/jp2.c
--- a/coders/jp2.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/coders/jp2.c	Fri Apr 01 09:04:54 2022 -0500
@@ -725,6 +725,10 @@
 
     /* Get current seek position (normally 0) */
     pos=TellBlob(image);
+    if (pos < 0)
+      {
+        ThrowJP2ReaderException(BlobError,UnableToObtainOffset,image);
+      }
 
     /* Read header */
     if ((magick_length=ReadBlob(image,sizeof(magick),magick)) != sizeof(magick))
@@ -1007,23 +1011,32 @@
   */
   for (component=0; component < (long) number_components; component++)
     {
-      unsigned long
+      double
+        scale_to_quantum;
+
+      unsigned int
         component_depth,
         i,
         max_value;
 
-      double
-        scale_to_quantum;
-
       component_depth=jas_image_cmptprec(jp2_image,components[component]);
-      max_value=MaxValueGivenBits(component_depth);
+      if ((0 == component_depth) || (component_depth > 16))
+        {
+          (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                "Component %u depth is %u!",
+                                component, component_depth);
+          ThrowJP2ReaderException(CorruptImageError,ImproperImageHeader,image);
+        }
+      max_value=(unsigned int) MaxValueGivenBits(component_depth);
+      if ((0 == max_value) || (max_value > 65535))
+        ThrowJP2ReaderException(CorruptImageError,ImproperImageHeader,image);
       scale_to_quantum=MaxRGBDouble/max_value;
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "Channel %d scale is %g", component, scale_to_quantum);
       channel_lut[component]=MagickAllocateResourceLimitedArray(Quantum *, (size_t) max_value+1,sizeof(Quantum));
       if (channel_lut[component] == (Quantum *) NULL)
         ThrowJP2ReaderException(ResourceLimitError,MemoryAllocationFailed,image);
-      for(i=0; i <= max_value; i++)
+      for (i=0; i <= max_value; i++)
         (channel_lut[component])[i]=scale_to_quantum*i+0.5;
     }
 
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/error.c
--- a/magick/error.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/error.c	Fri Apr 01 09:04:54 2022 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003-2019 GraphicsMagick Group
+% Copyright (C) 2003-2022 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 % Copyright 1991-1999 E. I. du Pont de Nemours and Company
 %
@@ -1030,15 +1030,24 @@
       if (reason)
         {
           if (description)
-            (void) LogMagickEvent(severity,module,function,line,"Ignored: %.1024s (%.1024s)",
+            (void) LogMagickEvent(severity,
+                                  module != NULL ? module : "",
+                                  function != NULL ? function : "",
+                                  line,"Ignored: %.1024s (%.1024s)",
                                   reason,description);
           else
-            (void) LogMagickEvent(severity,module,function,line,"Ignored: %.1024s",
+            (void) LogMagickEvent(severity,
+                                  module != NULL ? module : "",
+                                  function != NULL ? function : "",
+                                  line,"Ignored: %.1024s",
                                   reason);
         }
       else
         {
-          (void) LogMagickEvent(severity,module,function,line,
+          (void) LogMagickEvent(severity,
+                                module != NULL ? module : "",
+                                function != NULL ? function : "",
+                                line,
                                 "Ignored: exception contains no reason!");
         }
       ignore=MagickTrue;
@@ -1085,15 +1094,24 @@
       if (exception->reason)
         {
           if (exception->description)
-            (void) LogMagickEvent(severity,module,function,line,"%.1024s (%.1024s)",
+            (void) LogMagickEvent(severity,
+                                  module != NULL ? module : "",
+                                  function != NULL ? function : "",
+                                  line,"%.1024s (%.1024s)",
                                   exception->reason,exception->description );
           else
-            (void) LogMagickEvent(severity,module,function,line,"%.1024s",
+            (void) LogMagickEvent(severity,
+                                  module != NULL ? module : "",
+                                  function != NULL ? function : "",
+                                  line,"%.1024s",
                                   exception->reason);
         }
       else
         {
-          (void) LogMagickEvent(severity,module,function,line,
+          (void) LogMagickEvent(severity,
+                                module != NULL ? module : "",
+                                function != NULL ? function : "",
+                                line,
                                 "exception contains no reason!");
         }
     }
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/gradient.c
--- a/magick/gradient.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/gradient.c	Fri Apr 01 09:04:54 2022 -0500
@@ -189,7 +189,13 @@
     ThrowBinaryException(ResourceLimitError,MemoryAllocationFailed,
                          image->filename);
   if (span <= MaxColormapSize)
-    AllocateImageColormap(image,(unsigned long) span);
+    if (!AllocateImageColormap(image,(unsigned long) span))
+      {
+        MagickFreeMemory(pixel_packets);
+        ThrowException3(&image->exception, ResourceLimitError,MemoryAllocationFailed,
+                        UnableToConstituteImage);
+        return MagickFail;
+      }
 
   /*
     Generate gradient pixels using alpha blending
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/locale.c
--- a/magick/locale.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/locale.c	Fri Apr 01 09:04:54 2022 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003, 2004 GraphicsMagick Group
+% Copyright (C) 2003 - 2022 GraphicsMagick Group
 %
 % This program is covered by multiple licenses, which are described in
 % Copyright.txt. You should have received a copy of Copyright.txt with this
@@ -198,7 +198,7 @@
 
   (void) strlcpy(category,tag,MaxTextExtent);
   ChopLocaleComponents(category,2);
-  for (k=0; k < ArraySize(category_map); k++)
+  for (k=0; k < ArraySize(category_map)-1; k++)
     {
       if (LocaleCompare(category,category_map[k].name) == 0)
         {
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/magick_types.h.in
--- a/magick/magick_types.h.in	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/magick_types.h.in	Fri Apr 01 09:04:54 2022 -0500
@@ -113,36 +113,47 @@
 #else
 
   /* The following typedefs are subtituted when using Unixish configure */
-  typedef @INT8_T@   magick_int8_t;
-  typedef @UINT8_T@  magick_uint8_t;
+  typedef @INT8_T@   magick_int8_t;     /* int8_t */
+  typedef @UINT8_T@  magick_uint8_t;    /* uint8_t */
 
-  typedef @INT16_T@  magick_int16_t;
-  typedef @UINT16_T@ magick_uint16_t;
+  typedef @INT16_T@  magick_int16_t;    /* int16_t */
+  typedef @UINT16_T@ magick_uint16_t;   /* uint16_t */
 
-  typedef @INT32_T@  magick_int32_t;
-  typedef @UINT32_T@ magick_uint32_t;
+  typedef @INT32_T@  magick_int32_t;    /* int32_t */
+  typedef @UINT32_T@ magick_uint32_t;   /* uint32_t */
 
-  typedef @INT64_T@  magick_int64_t;
-  typedef @UINT64_T@ magick_uint64_t;
+  typedef @INT64_T@  magick_int64_t;    /* int64_t */
+  typedef @UINT64_T@ magick_uint64_t;   /* uint64_t */
 
 #  if defined(MAGICK_IMPLEMENTATION)
 
-#  define MAGICK_INT32_F @INT32_F@
-#  define MAGICK_UINT32_F @UINT32_F@
-#  define MAGICK_INT64_F @INT64_F@
-#  define MAGICK_UINT64_F @UINT64_F@
+#  define MAGICK_INT32_F @INT32_F@      /* %PRId32 */
+#  define MAGICK_UINT32_F @UINT32_F@    /* %PRIu32 */
+#  define MAGICK_INT64_F @INT64_F@      /* %PRId64 */
+#  define MAGICK_UINT64_F @UINT64_F@    /* %PRIu64 */
 
-  typedef @UINTMAX_T@ magick_uintmax_t;
-#  define MAGICK_UINTMAX_F @UINTMAX_F@
+  /*
+    C99 special size specifiers:
 
-  typedef @UINTPTR_T@ magick_uintptr_t;
-#  define MAGICK_UINTPTR_F @UINTPTR_F@
+    hh - signed char / unsigned char
+    h  - short / unsigned short
+    ll - long long / unsigned long long
+    j  - intmax_t / uintmax_t
+    z  - signed size_t / size_t
+    t  - ptrdiff_t / unsigned ptrdiff_t
+  */
 
-#  define MAGICK_SIZE_T_F @MAGICK_SIZE_T_F@
-#  define MAGICK_SIZE_T @MAGICK_SIZE_T@
+  typedef @UINTMAX_T@ magick_uintmax_t; /* uintmax_t */
+#  define MAGICK_UINTMAX_F @UINTMAX_F@  /* %ju */
+
+  typedef @UINTPTR_T@ magick_uintptr_t; /* uintptr_t */
+#  define MAGICK_UINTPTR_F @UINTPTR_F@  /* %tu */
 
-#  define MAGICK_SSIZE_T_F @MAGICK_SSIZE_T_F@
-#  define MAGICK_SSIZE_T @MAGICK_SSIZE_T@
+#  define MAGICK_SIZE_T_F @MAGICK_SIZE_T_F@ /* %zu */
+#  define MAGICK_SIZE_T @MAGICK_SIZE_T@     /* size_t */
+
+#  define MAGICK_SSIZE_T_F @MAGICK_SSIZE_T_F@ /* %zd */
+#  define MAGICK_SSIZE_T @MAGICK_SSIZE_T@     /* ssize_t */
 
 #endif /* defined(MAGICK_IMPLEMENTATION) */
 
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/render.c
--- a/magick/render.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/render.c	Fri Apr 01 09:04:54 2022 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003-2020 GraphicsMagick Group
+% Copyright (C) 2003-2022 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 % Copyright 1991-1999 E. I. du Pont de Nemours and Company
 %
@@ -5907,7 +5907,7 @@
   dvalue=ceil(primitive_info->point.x-0.5);
   if (MAGICK_ISNAN(dvalue) || ((dvalue < DTOLONG_MIN)) || (dvalue > DTOLONG_MAX))
     {
-      char double_str[18];
+      char double_str[MaxTextExtent];
       FormatString(double_str,"%g",dvalue);
       ThrowException(&image->exception,DrawError,PrimitiveArithmeticOverflow,double_str);
       return MagickFail;
@@ -5916,7 +5916,7 @@
   dvalue=ceil(primitive_info->point.y-0.5);
   if (MAGICK_ISNAN(dvalue) || ((dvalue < DTOLONG_MIN)) || (dvalue > DTOLONG_MAX))
     {
-      char double_str[18];
+      char double_str[MaxTextExtent];
       FormatString(double_str,"%g",dvalue);
       ThrowException(&image->exception,DrawError,PrimitiveArithmeticOverflow,double_str);
       return MagickFail;
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/resize.c
--- a/magick/resize.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/resize.c	Fri Apr 01 09:04:54 2022 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003 - 2019 GraphicsMagick Group
+% Copyright (C) 2003 - 2022 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 %
 % This program is covered by multiple licenses, which are described in
@@ -1805,6 +1805,7 @@
       MagickFreeMemory(scale_scanline);
       MagickFreeMemory(x_vector);
       MagickFreeMemory(y_vector);
+      MagickFreeMemory(y_volumes);
       DestroyImage(scale_image);
       ThrowImageException3(ResourceLimitError,MemoryAllocationFailed,
                            UnableToScaleImage);
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/version.h
--- a/magick/version.h	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/version.h	Fri Apr 01 09:04:54 2022 -0500
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x272400
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 27,24,0
-#define MagickChangeDate   "20220326"
-#define MagickReleaseDate  "snapshot-20220326"
+#define MagickChangeDate   "20220401"
+#define MagickReleaseDate  "snapshot-20220401"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 230c7f549ba5 -r 8c5fdda5297d magick/xwindow.c
--- a/magick/xwindow.c	Sat Mar 26 13:22:31 2022 -0500
+++ b/magick/xwindow.c	Fri Apr 01 09:04:54 2022 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003 - 2020 GraphicsMagick Group
+% Copyright (C) 2003 - 2022 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 %
 % This program is covered by multiple licenses, which are described in
@@ -7195,6 +7195,13 @@
     magnify>>=1;
   while (magnify > windows->magnify.height)
     magnify>>=1;
+  if (magnify == 0)
+    {
+      if (previous_magnify != 0)
+        magnify = previous_magnify;
+      else
+        magnify = 1;
+    }
   if (magnify != previous_magnify)
     {
       unsigned int
diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changelog.html
--- a/www/Changelog.html	Sat Mar 26 13:22:31 2022 -0500
+++ b/www/Changelog.html	Fri Apr 01 09:04:54 2022 -0500
@@ -35,8 +35,26 @@
 <div class="document">
 
 
+<p>2022-04-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>
+<p>* magick/error.c (ThrowLoggedException): Silence Coverity 376912
+&quot;Dereference after null check (FORWARD_NULL)&quot;.</p>
+<p>* coders/jp2.c (ReadJP2Image): Silence Coverity 264883 &quot;Division
+or modulo by float zero (DIVIDE_BY_ZERO)&quot;.
+(ReadJP2Image): Fix Coverity 376911 &quot;Improper use of negative
+value (NEGATIVE_RETURNS)&quot;.</p>
+<p>* magick/xwindow.c (MagickXMakeMagnifyImage): Fix Coverity 376906
+&quot;Division or modulo by zero (DIVIDE_BY_ZERO)&quot;.</p>
+<p>* magick/resize.c (ScaleImage): Fix Coverity 376908 &quot;Resource leak
+(RESOURCE_LEAK)&quot;.</p>
+<p>* magick/locale.c (GetLocaleMessageFromTag): Fix Coverity 376907
+&quot;Out-of-bounds read (OVERRUN)&quot;.</p>
+<p>* magick/render.c (DrawPrimitive): Fix Coverity 376904
+&quot;Out-of-bounds access (OVERRUN)&quot;.</p>
+</blockquote>
 <p>2022-03-26  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>
+<p>* version.sh: Prepare for 1.3.38 release.</p>
 <p>* Makefile.am (release, snapshot): Generate SHA-256 checksums as a
 by-product of 'make snapshot' or 'make release'.</p>
 <p>* www/download.rst: Add documentation regaring SHA-256 checksums.</p>
diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changes.html
--- a/www/Changes.html	Sat Mar 26 13:22:31 2022 -0500
+++ b/www/Changes.html	Fri Apr 01 09:04:54 2022 -0500
@@ -43,7 +43,7 @@
 <p>The following are the <tt class="docutils literal">GraphicsMagick</tt> change logs since 2001:</p>
 <blockquote>
 <ul class="simple">
-<li><a class="reference external" href="Changelog.html">2022</a> (nothing released yet)</li>
+<li><a class="reference external" href="Changelog.html">2022</a> (1.3.38 released)</li>
 <li><a class="reference external" href="ChangeLog-2021.html">2021</a> (1.3.37 released)</li>
 <li><a class="reference external" href="ChangeLog-2020.html">2020</a> (1.3.35, 1.3.36 released)</li>
 <li><a class="reference external" href="ChangeLog-2019.html">2019</a> (1.3.32, 1.3.33, 1.3.34 released)</li>
diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changes.rst
--- a/www/Changes.rst	Sat Mar 26 13:22:31 2022 -0500
+++ b/www/Changes.rst	Fri Apr 01 09:04:54 2022 -0500
@@ -46,7 +46,7 @@
 
 The following are the ``GraphicsMagick`` change logs since 2001:
 
-  * 2022_ (nothing released yet)
+  * 2022_ (1.3.38 released)
 
   * 2021_ (1.3.37 released)
 
diff -r 230c7f549ba5 -r 8c5fdda5297d www/links.html
--- a/www/links.html	Sat Mar 26 13:22:31 2022 -0500
+++ b/www/links.html	Fri Apr 01 09:04:54 2022 -0500
@@ -67,6 +67,7 @@
 <p>Debian <a class="reference external" href="http://packages.debian.org/search?keywords=GraphicsMagick&amp;amp;searchon=names&amp;amp;suite=all&amp;amp;section=main">GraphicsMagick packages</a>.</p>
 <p><a class="reference external" href="http://en.wikipedia.org/wiki/GraphicsMagick">WikiPedia</a> GraphicsMagick Entry.</p>
 <p><a class="reference external" href="https://www.openhub.net/p/graphics_magick">Black Duck | Open HUB</a> GraphicsMagick Entry.</p>
+<p><a href="#id21"><span class="problematic" id="id22">`Repology &lt;https://repology.org/project/graphicsmagick/versions`_</span></a> GraphicsMagick Package Versions in OS distributions.</p>
 <p><a class="reference external" href="https://sourceforge.net/projects/graphicsmagick/">SourceForge</a> GraphicsMagick Entry.</p>
 <p><a class="reference external" href="http://stackoverflow.com/questions/tagged/graphicsmagick?">GraphicsMagick questions on StackOverflow</a>.</p>
 <p><a class="reference external" href="https://abi-laboratory.pro/tracker/timeline/graphicsmagick/">GraphicsMagick ABI/API Changes</a>.</p>
@@ -201,6 +202,12 @@
 <h1><a class="toc-backref" href="#id20">Stock Photos</a></h1>
 <p><a class="reference external" href="https://morguefile.com/">MorgueFile</a>, Free high-resolution stock photo images.</p>
 </div>
+<div class="system-messages section">
+<h1>Docutils System Messages</h1>
+<div class="system-message" id="id21">
+<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">/home/bfriesen/src/GM/www/links.rst</tt>, line 30); <em><a href="#id22">backlink</a></em></p>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.