GraphicsMagick: MSLStartElement(): Return immediately if there i...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.9476.1635875009.1346.graphicsmagick-commit@lists.sourceforge.net>
changeset 2067faf19869 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=2067faf19869
summary: MSLStartElement(): Return immediately if there is already an error or the image is NULL.  Do not discard exceptions when calling functions which return a new image.

diffstat:

 ChangeLog                              |    8 ++
 VisualMagick/installer/inc/version.isx |    4 +-
 coders/msl.c                           |  102 +++++++++++++++++++-------------
 magick/version.h                       |    4 +-
 www/Changelog.html                     |    7 ++
 5 files changed, 80 insertions(+), 45 deletions(-)

diffs (457 lines):

diff -r 9e045696119e -r 2067faf19869 ChangeLog
--- a/ChangeLog	Sun Oct 31 11:50:34 2021 -0500
+++ b/ChangeLog	Tue Nov 02 12:39:01 2021 -0500
@@ -1,3 +1,11 @@
+2021-11-02  Bob Friesenhahn  <[email protected]>
+
+        * coders/msl.c (MSLStartElement): Return immediately if there is
+        already an error or the image is NULL.  Do not discard exceptions
+        when calling functions which return a new image.  Try even harder
+        to shut down the libxml2 parser. Fixes SourceForge issue 652 "SEGV
+        in gm at coders/msl.c:883".
+
 2021-10-31  Bob Friesenhahn  <[email protected]>
 
         * magick/widget.c (MagickXPreferencesWidget): Eliminate
diff -r 9e045696119e -r 2067faf19869 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Sun Oct 31 11:50:34 2021 -0500
+++ b/VisualMagick/installer/inc/version.isx	Tue Nov 02 12:39:01 2021 -0500
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020211031"
-#define public MagickPackageReleaseDate "snapshot-20211031"
+#define public MagickPackageVersionAddendum ".020211102"
+#define public MagickPackageReleaseDate "snapshot-20211102"
diff -r 9e045696119e -r 2067faf19869 coders/msl.c
--- a/coders/msl.c	Sun Oct 31 11:50:34 2021 -0500
+++ b/coders/msl.c	Tue Nov 02 12:39:01 2021 -0500
@@ -448,7 +448,7 @@
     Receive the document locator at startup, actually xmlDefaultSAXLocator.
   */
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                        "  SAX.setDocumentLocator()\n");
+                        "  SAX.setDocumentLocator()");
   /*   msl_info=(MSLInfo *) context; */
 }
 
@@ -644,8 +644,17 @@
   */
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                         "  SAX.startElement(%.1024s",name);
+  msl_info=(MSLInfo *) context;
+  /*
+    If we already have an exception at error level, then just return.
+    Eventually the XML reader will stop.
+  */
+  if (msl_info->exception->severity >= ErrorException)
+    {
+      (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  )");
+      return;
+    }
   GetExceptionInfo(&exception);
-  msl_info=(MSLInfo *) context;
   n=msl_info->n;
   keyword=(const char *) NULL;
   switch (*name)
@@ -718,7 +727,7 @@
                 *newImage;
 
               newImage=BlurImage(msl_info->image[n],radius,sigma,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -757,7 +766,7 @@
                               (void) QueryColorDatabase
                                 (value,
                                  &msl_info->image[n]->border_color,
-                                 &exception);
+                                 msl_info->exception);
                               break;
                             }
                           ThrowException(msl_info->exception,OptionError,
@@ -827,7 +836,7 @@
               rectInfo.y = y;
 
               border_image=BorderImage(msl_info->image[n],&rectInfo,
-                                       &msl_info->image[n]->exception);
+                                       msl_info->exception);
               if (border_image == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -908,7 +917,7 @@
                 *newImage;
 
               newImage=CharcoalImage(msl_info->image[n],radius,sigma,
-                                     &msl_info->image[n]->exception);
+                                     msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1025,7 +1034,7 @@
               rectInfo.y = y;
 
               newImage=ChopImage(msl_info->image[n],&rectInfo,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1351,7 +1360,7 @@
               rectInfo.y = y;
 
               newImage=CropImage(msl_info->image[n],&rectInfo,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1379,7 +1388,7 @@
                 *newImage;
 
               newImage=DespeckleImage(msl_info->image[n],
-                                      &msl_info->image[n]->exception);
+                                      msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1446,7 +1455,7 @@
                 *newImage;
 
               newImage=EdgeImage(msl_info->image[n],radius,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1519,7 +1528,7 @@
                 *newImage;
 
               newImage=EmbossImage(msl_info->image[n],radius,sigma,
-                                   &msl_info->image[n]->exception);
+                                   msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1539,7 +1548,7 @@
                 *newImage;
 
               newImage=EnhanceImage(msl_info->image[n],
-                                    &msl_info->image[n]->exception);
+                                    msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1585,7 +1594,7 @@
                 *newImage;
 
               newImage=FlattenImages(msl_info->image[n],
-                                     &msl_info->image[n]->exception);
+                                     msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1605,7 +1614,7 @@
                 *newImage;
 
               newImage=FlipImage(msl_info->image[n],
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1625,7 +1634,7 @@
                 *newImage;
 
               newImage=FlopImage(msl_info->image[n],
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1664,7 +1673,7 @@
                               (void) QueryColorDatabase
                                 (value,
                                  &msl_info->image[n]->matte_color,
-                                 &exception);
+                                 msl_info->exception);
                               break;
                             }
                           ThrowException(msl_info->exception,OptionError,
@@ -1786,7 +1795,7 @@
               frameInfo.inner_bevel = y;
 
               newImage=FrameImage(msl_info->image[n],&frameInfo,
-                                  &msl_info->image[n]->exception);
+                                  msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -1989,7 +1998,7 @@
                           (void) QueryColorDatabase
                             (value,
                              &msl_info->image_info[n]->background_color,
-                             &exception);
+                             msl_info->exception);
                           break;
                         }
                       ThrowException(msl_info->exception,OptionError,
@@ -2130,7 +2139,7 @@
                 *newImage;
 
               newImage=ImplodeImage(msl_info->image[n],amount,
-                                    &msl_info->image[n]->exception);
+                                    msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2157,7 +2166,7 @@
                 *newImage;
 
               newImage=MagnifyImage(msl_info->image[n],
-                                    &msl_info->image[n]->exception);
+                                    msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2217,7 +2226,7 @@
                 *newImage;
 
               newImage=MedianFilterImage(msl_info->image[n], radius,
-                                         &msl_info->image[n]->exception);
+                                         msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2238,7 +2247,7 @@
                 *newImage;
 
               newImage=MinifyImage(msl_info->image[n],
-                                   &msl_info->image[n]->exception);
+                                   msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2333,7 +2342,7 @@
                 *newImage;
 
               newImage=OilPaintImage(msl_info->image[n], radius,
-                                     &msl_info->image[n]->exception);
+                                     msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2635,7 +2644,7 @@
                 *newImage;
 
               newImage=ReduceNoiseImage(msl_info->image[n], radius,
-                                        &msl_info->image[n]->exception);
+                                        msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2753,7 +2762,7 @@
                   (height == msl_info->image[n]->rows))
                 break;
               resize_image=ZoomImage(msl_info->image[n],width,height,
-                                     &msl_info->image[n]->exception);
+                                     msl_info->exception);
               if (resize_image == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2840,7 +2849,7 @@
                 *newImage;
 
               newImage=RollImage(msl_info->image[n], x, y,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2901,7 +2910,7 @@
                 *newImage;
 
               newImage=RotateImage(msl_info->image[n], degrees,
-                                   &msl_info->image[n]->exception);
+                                   msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -2995,7 +3004,7 @@
                 *newImage;
 
               newImage=SampleImage(msl_info->image[n], width, height,
-                                   &msl_info->image[n]->exception);
+                                   msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3082,7 +3091,7 @@
                 *newImage;
 
               newImage=ScaleImage(msl_info->image[n], width, height,
-                                  &msl_info->image[n]->exception);
+                                  msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3118,7 +3127,7 @@
                           (void) QueryColorDatabase
                             (value,
                              &msl_info->image_info[n]->background_color,
-                             &exception);
+                             msl_info->exception);
                           break;
                         }
                       else if (LocaleCompare(keyword,"bordercolor") == 0)
@@ -3126,7 +3135,7 @@
                           (void) QueryColorDatabase
                             (value,
                              &msl_info->image_info[n]->border_color,
-                             &exception);
+                             msl_info->exception);
                           break;
                         }
                       ThrowException(msl_info->exception,OptionError,
@@ -3215,7 +3224,7 @@
                           (void) QueryColorDatabase
                             (value,
                              &msl_info->image_info[n]->matte_color,
-                             &exception);
+                             msl_info->exception);
                           break;
                         }
                       ThrowException(msl_info->exception,OptionError,
@@ -3318,7 +3327,7 @@
                 *newImage;
 
               newImage=SharpenImage(msl_info->image[n],radius,sigma,
-                                    &msl_info->image[n]->exception);
+                                    msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3411,7 +3420,7 @@
 
 
               newImage=ShaveImage(msl_info->image[n], &rectInfo,
-                                  &msl_info->image[n]->exception);
+                                  msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3486,7 +3495,7 @@
                 *newImage;
 
               newImage=ShearImage(msl_info->image[n], x, y,
-                                  &msl_info->image[n]->exception);
+                                  msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3599,7 +3608,7 @@
                 *newImage;
 
               newImage=SpreadImage(msl_info->image[n], radius,
-                                   &msl_info->image[n]->exception);
+                                   msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -3671,7 +3680,7 @@
                   *newImage;
 
                 newImage=SteganoImage(msl_info->image[n], watermark,
-                                      &msl_info->image[n]->exception);
+                                      msl_info->exception);
                 if (newImage == (Image *) NULL)
                   break;
                 DestroyImage(msl_info->image[n]);
@@ -3745,7 +3754,7 @@
                   *newImage;
 
                 newImage=StereoImage(msl_info->image[n], stereoImage,
-                                     &msl_info->image[n]->exception);
+                                     msl_info->exception);
                 if (newImage == (Image *) NULL)
                   break;
                 DestroyImage(msl_info->image[n]);
@@ -3807,7 +3816,7 @@
                 *newImage;
 
               newImage=SwirlImage(msl_info->image[n], degrees,
-                                  &msl_info->image[n]->exception);
+                                  msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -4006,7 +4015,7 @@
                             (msl_info->image[n],
                              &target,0,0,
                              &(msl_info->image[n])->exception);
-                          (void) QueryColorDatabase(value,&target,&exception);
+                          (void) QueryColorDatabase(value,&target,msl_info->exception);
                           (void) TransparentImage(msl_info->image[n],target,
                                                   TransparentOpacity);
                           break;
@@ -4044,7 +4053,7 @@
               rectInfo.x =  rectInfo.y = 0;
 
               newImage=CropImage(msl_info->image[n],&rectInfo,
-                                 &msl_info->image[n]->exception);
+                                 msl_info->exception);
               if (newImage == (Image *) NULL)
                 break;
               DestroyImage(msl_info->image[n]);
@@ -4117,6 +4126,17 @@
     }
   if ( value != NULL )
     MagickFreeMemory(value);
+  /*
+    If image-specific exception has an exception more severe than MSL
+    global exception, then copy to MSL global exception.
+  */
+  if ((msl_info->image[n] != (Image *) NULL) &&
+      (msl_info->image[n]->exception.severity > msl_info->exception->severity))
+    {
+      CopyException(msl_info->exception,&msl_info->image[n]->exception);
+    }
+  if (msl_info->exception->severity >= ErrorException)
+    xmlStopParser(msl_info->parser);
   (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  )");
 }
 
diff -r 9e045696119e -r 2067faf19869 magick/version.h
--- a/magick/version.h	Sun Oct 31 11:50:34 2021 -0500
+++ b/magick/version.h	Tue Nov 02 12:39:01 2021 -0500
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x252200
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 25,22,0
-#define MagickChangeDate   "20211031"
-#define MagickReleaseDate  "snapshot-20211031"
+#define MagickChangeDate   "20211102"
+#define MagickReleaseDate  "snapshot-20211102"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 9e045696119e -r 2067faf19869 www/Changelog.html
--- a/www/Changelog.html	Sun Oct 31 11:50:34 2021 -0500
+++ b/www/Changelog.html	Tue Nov 02 12:39:01 2021 -0500
@@ -35,6 +35,13 @@
 <div class="document">
 
 
+<p>2021-11-02  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>
+* coders/msl.c (MSLStartElement): Return immediately if there is
+already an error or the image is NULL.  Do not discard exceptions
+when calling functions which return a new image.  Try even harder
+to shut down the libxml2 parser. Fixes SourceForge issue 652 &quot;SEGV
+in gm at coders/msl.c:883&quot;.</blockquote>
 <p>2021-10-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>
 * magick/widget.c (MagickXPreferencesWidget): Eliminate
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.