GraphicsMagick: XCF: Avoid undefined behavior warning related to...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.5584.1690846033.8047.graphicsmagick-commit@lists.sourceforge.net>
changeset fceb8821a954 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=fceb8821a954
summary: XCF: Avoid undefined behavior warning related to the number of layers

diffstat:

 ChangeLog                              |   8 ++++++++
 VisualMagick/installer/inc/version.isx |   4 ++--
 coders/xcf.c                           |  15 ++++++++++-----
 magick/version.h                       |   4 ++--
 www/Changelog.html                     |  10 ++++++++++
 5 files changed, 32 insertions(+), 9 deletions(-)

diffs (114 lines):

diff -r 2331fb1bd1da -r fceb8821a954 ChangeLog
--- a/ChangeLog	Sun Jul 30 11:39:59 2023 -0500
+++ b/ChangeLog	Mon Jul 31 18:27:03 2023 -0500
@@ -1,3 +1,11 @@
+2023-07-31  Bob Friesenhahn  <[email protected]>
+
+	* coders/xcf.c (ReadXCFImage): Limit the maximum number of layers
+	to the range of 'long'.  Adjust arithmetic/cast to avoid undefined
+	behavior warning. Resolves SourceForge issue #713
+	"coders/xcf.c:1926:53: warning: iteration 9223372036854775806
+	invokes undefined behavior".
+
 2023-07-30  Bob Friesenhahn  <[email protected]>
 
 	* NEWS.txt: Update the news!
diff -r 2331fb1bd1da -r fceb8821a954 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Sun Jul 30 11:39:59 2023 -0500
+++ b/VisualMagick/installer/inc/version.isx	Mon Jul 31 18:27:03 2023 -0500
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020230730"
-#define public MagickPackageReleaseDate "snapshot-20230730"
+#define public MagickPackageVersionAddendum ".020230731"
+#define public MagickPackageReleaseDate "snapshot-20230731"
diff -r 2331fb1bd1da -r fceb8821a954 coders/xcf.c
--- a/coders/xcf.c	Sun Jul 30 11:39:59 2023 -0500
+++ b/coders/xcf.c	Mon Jul 31 18:27:03 2023 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003-2020 GraphicsMagick Group
+% Copyright (C) 2003-2023 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 %
 % This program is covered by multiple licenses, which are described in
@@ -28,7 +28,7 @@
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%
+% https://testing.developer.gimp.org/core/standards/xcf
 */
 
 /*
@@ -1730,6 +1730,11 @@
             foundAllLayers = MagickTrue;
           else
             number_layers++;
+
+          /* Check for too many layers */
+          if (number_layers == (unsigned long) LONG_MAX)
+            ThrowReaderException(CorruptImageError,CorruptImage,image);
+
           previous_offset=offset;
         } while ( !foundAllLayers );
 
@@ -1877,7 +1882,7 @@
             long
               j;
 
-            for (j=number_layers-1; j>=0; j--)
+            for (j=(long) (number_layers-1); j>=0; j--)
               {
                 /* BOGUS: need to consider layer blending modes!! */
                 if ( layer_info[j].visible )  /* only visible ones, please! */
@@ -1923,11 +1928,11 @@
             */
             image->next=layer_info[number_layers-2].image;
             layer_info[number_layers-2].image->previous=image;
-            for (j=(long) number_layers-2; j >= 0; j--)
+            for (j=(long) ((number_layers-2)); j >= 0; j--)
               {
                 if (j > 0)
                   layer_info[j].image->next=layer_info[j-1].image;
-                if (j < ((long) number_layers-1))
+                if (j < ((long) (number_layers-1)))
                   layer_info[j].image->previous=layer_info[j+1].image;
                 layer_info[j].image->page.x = layer_info[j].offset_x;
                 layer_info[j].image->page.y = layer_info[j].offset_y;
diff -r 2331fb1bd1da -r fceb8821a954 magick/version.h
--- a/magick/version.h	Sun Jul 30 11:39:59 2023 -0500
+++ b/magick/version.h	Mon Jul 31 18:27:03 2023 -0500
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x272402
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 27,24,2
-#define MagickChangeDate   "20230730"
-#define MagickReleaseDate  "snapshot-20230730"
+#define MagickChangeDate   "20230731"
+#define MagickReleaseDate  "snapshot-20230731"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 2331fb1bd1da -r fceb8821a954 www/Changelog.html
--- a/www/Changelog.html	Sun Jul 30 11:39:59 2023 -0500
+++ b/www/Changelog.html	Mon Jul 31 18:27:03 2023 -0500
@@ -37,6 +37,16 @@
 </div>
 
 <div class="document">
+<p>2023-07-31  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/xcf.c (ReadXCFImage): Limit the maximum number of layers
+to the range of 'long'.  Adjust arithmetic/cast to avoid undefined
+behavior warning. Resolves SourceForge issue #713
+&quot;coders/xcf.c:1926:53: warning: iteration 9223372036854775806
+invokes undefined behavior&quot;.</p></li>
+</ul>
+</blockquote>
 <p>2023-07-30  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">
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.