GraphicsMagick: Support and use XML predefined entities substiti...

GraphicsMagick Commits <[email protected]> Mon, 16 Dec 2024 10:51:20 -0600
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.41803.1734367894.7812.graphicsmagick-commit@lists.sourceforge.net>
changeset cf7cd5ebabb0 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=cf7cd5ebabb0
summary: Support and use XML predefined entities substitions for '&' and '<' in delegates.mgk so the file syntax is valid XML.

diffstat:

 ChangeLog                              |  13 +++++++++++++
 VisualMagick/installer/inc/version.isx |   4 ++--
 config/delegates.mgk.in                |  22 +++++++++++++++++-----
 magick/delegate.c                      |  15 +++++++++++++++
 magick/utility.c                       |   8 ++++++--
 magick/version.h                       |   4 ++--
 www/ChangeLog.html                     |  13 +++++++++++++
 7 files changed, 68 insertions(+), 11 deletions(-)

diffs (165 lines):

diff -r 766c366df86d -r cf7cd5ebabb0 ChangeLog
--- a/ChangeLog	Thu Dec 05 08:18:29 2024 -0600
+++ b/ChangeLog	Mon Dec 16 10:50:23 2024 -0600
@@ -1,3 +1,16 @@
+2024-12-16  Bob Friesenhahn  <[email protected]>
+
+	* config/delegates.mgk.in: Use XML predefined entities
+	substitutions for '&' and '<' so that the file syntax is valid
+	XML.  Older/existing files using "invalid" XML continue to be
+	accepted.
+
+	* magick/delegate.c (ReadConfigureFile): Support XML predefined
+	entities substitutions.
+
+	* magick/utility.c (SubstituteString): Fix off-by-one error which
+	caused back-to-back substitions to not work correctly.
+
 2024-12-05  Bob Friesenhahn  <[email protected]>
 
 	* fuzzing/oss-fuzz-build.sh: Remove duplicate request.
diff -r 766c366df86d -r cf7cd5ebabb0 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Thu Dec 05 08:18:29 2024 -0600
+++ b/VisualMagick/installer/inc/version.isx	Mon Dec 16 10:50:23 2024 -0600
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020241205"
-#define public MagickPackageReleaseDate "snapshot-20241205"
+#define public MagickPackageVersionAddendum ".020241216"
+#define public MagickPackageReleaseDate "snapshot-20241216"
diff -r 766c366df86d -r cf7cd5ebabb0 config/delegates.mgk.in
--- a/config/delegates.mgk.in	Thu Dec 05 08:18:29 2024 -0600
+++ b/config/delegates.mgk.in	Mon Dec 16 10:50:23 2024 -0600
@@ -68,11 +68,23 @@
   Use 'gm convert -list delegates' to verify how the contents of this
   file has been parsed.
 
+  In XML, characters '&', '<', and '>' have special meanings. See
+  "https://www.w3.org/TR/xml/#syntax".  For example, '&' should be '&amp;'
+  or the character reference '&#038;'. XML supports the predefined entities
+  &amp;, &lt;, &gt;, &apos;, and &quot;.  The ampersand character (&) and
+  the left angle bracket (<) MUST NOT appear in their literal form in the
+  command definition text.  GraphicsMagick after December 16, 2024
+  introduces support for the predefined entities so that this file may be
+  expressed in valid XML, but the previous invalid syntax is still accepted.
+
  -->
 <delegatemap>
-  <delegate decode="browse" stealth="True" command='"@BrowseDelegate@" "http://www.GraphicsMagick.org/" &'  />
-  <delegate decode="cgm" command='"@CGMDecodeDelegate@" -d ps < "%i" > "%o" 2>/dev/null' />
+  <delegate decode="browse" stealth="True" command='"@BrowseDelegate@" "http://www.GraphicsMagick.org/" &amp;' />
+  <delegate decode="cgm" command='"@CGMDecodeDelegate@" -d ps &lt; "%i" > "%o" 2>/dev/null' />
+  <!-- The following recipe supports the original dcraw, which is no longer supported by Dave Coffin -->
   <delegate decode="dcraw" command='"@DCRAWDecodeDelegate@" -c -w @DcrawExtraOptions@ "%i" > "%o"' />
+  <!-- The following recipe supports dcraw_emu from libraw.  The critical -c option is used for something else! -->
+  <!-- <delegate decode="dcraw" command='"@DCRAWDecodeDelegate@" -Z - -w @DcrawExtraOptions@ "%i" > "%o"' /> -->
   <delegate decode="dot" command='"@DOTDecodeDelegate@" -Tps "%i" -o "%o"' />
   <delegate decode="dvi" command='"@DVIDecodeDelegate@" -q -o "%o" "%i"' />
   <delegate decode="edit" stealth="True" command='"@EditorDelegate@" -title "Edit Image Comment" -e vi "%o"' />
@@ -107,8 +119,8 @@
   <!-- Read color PDF using Poppler's pdftoppm -->
   <delegate decode="poppler-color" stealth="True" command='"pdftoppm" "-freetype" "yes" "-rx" "-aa" "yes" "-aaVector" "yes" "72" "-ry" "72" "%s" ">" "%s"' />
 
-  <delegate decode="hpg" command='"@HPGLDecodeDelegate@" -q -m eps -f `basename "%o"` "%i" && @MVDelegate@ -f `basename "%o"` "%o"' />
-  <delegate decode="hpgl" command='"@HPGLDecodeDelegate@" -q -m eps -f `basename "%o"` "%i" && @MVDelegate@ -f `basename "%o"` "%o"' />
+  <delegate decode="hpg" command='"@HPGLDecodeDelegate@" -q -m eps -f `basename "%o"` "%i" &amp;&amp; @MVDelegate@ -f `basename "%o"` "%o"' />
+  <delegate decode="hpgl" command='"@HPGLDecodeDelegate@" -q -m eps -f `basename "%o"` "%i" &amp;&amp; @MVDelegate@ -f `basename "%o"` "%o"' />
   <!-- Read HTML file  -->
   <delegate decode="htm" command='"@HTMLDecodeDelegate@" -U -o "%o" "%i"' />
   <!-- Read HTML file  -->
@@ -132,5 +144,5 @@
   <delegate decode="ps" encode="print" mode="encode" command='"@PrintDelegate@" "%i"' />
   <!-- Read HTML file  -->
   <delegate decode="shtml" command='"@HTMLDecodeDelegate@" -U -o "%o" "%i"' />
-  <delegate encode="show" stealth="True" command='"@GMDelegate@" display -immutable -delay 0 -window_group %g -title "%l of %f" "%o" &' />
+  <delegate encode="show" stealth="True" command='"@GMDelegate@" display -immutable -delay 0 -window_group %g -title "%l of %f" "%o" &amp;' />
 </delegatemap>
diff -r 766c366df86d -r cf7cd5ebabb0 magick/delegate.c
--- a/magick/delegate.c	Thu Dec 05 08:18:29 2024 -0600
+++ b/magick/delegate.c	Mon Dec 16 10:50:23 2024 -0600
@@ -1417,6 +1417,21 @@
             if (LocaleCompare((char *) keyword,"command") == 0)
               {
                 delegate_list->commands=AllocateString(token);
+                /*
+                  Support XML predefined entities substitutions.
+
+                  FIXME: Support XML character reference syntax and
+                  provide more optimized support for XML predefined
+                  entities substitutions.
+                 */
+                if (strchr(delegate_list->commands,'&') != (char *) NULL)
+                  {
+                    SubstituteString((char **) &delegate_list->commands,"&lt;","<");
+                    SubstituteString((char **) &delegate_list->commands,"&gt;",">");
+                    SubstituteString((char **) &delegate_list->commands,"&apos;","'");
+                    SubstituteString((char **) &delegate_list->commands,"&quot;","\"");
+                    SubstituteString((char **) &delegate_list->commands,"&amp;","&");
+                  }
 #if defined(MSWINDOWS)
                 if (strchr(delegate_list->commands,'@') != (char *) NULL)
                   {
diff -r 766c366df86d -r cf7cd5ebabb0 magick/utility.c
--- a/magick/utility.c	Thu Dec 05 08:18:29 2024 -0600
+++ b/magick/utility.c	Mon Dec 16 10:50:23 2024 -0600
@@ -5735,7 +5735,11 @@
       if ((p[i] == search[0]) && (strncmp(&p[i],search,search_len) == 0))
         {
           if (0 == replace_len)
-            replace_len=strlen(replace);
+            {
+              replace_len=strlen(replace);
+              if (replace_len == 0)
+                break;
+            }
           if (replace_len > search_len)
             {
               size_t
@@ -5754,7 +5758,7 @@
             (void) MagickCloneMemory(&p[i+replace_len],&p[i+search_len],
                                      strlen(&p[i+search_len])+1);
           (void) MagickCloneMemory(&p[i],replace,replace_len);
-          i += replace_len;
+          i += (replace_len-1);
           replaced=MagickTrue;
         }
     }
diff -r 766c366df86d -r cf7cd5ebabb0 magick/version.h
--- a/magick/version.h	Thu Dec 05 08:18:29 2024 -0600
+++ b/magick/version.h	Mon Dec 16 10:50:23 2024 -0600
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x282502
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 28,25,2
-#define MagickChangeDate   "20241205"
-#define MagickReleaseDate  "snapshot-20241205"
+#define MagickChangeDate   "20241216"
+#define MagickReleaseDate  "snapshot-20241216"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r 766c366df86d -r cf7cd5ebabb0 www/ChangeLog.html
--- a/www/ChangeLog.html	Thu Dec 05 08:18:29 2024 -0600
+++ b/www/ChangeLog.html	Mon Dec 16 10:50:23 2024 -0600
@@ -38,6 +38,19 @@
 
 <main id="graphicsmagick-changelog">
 <h1 class="title">GraphicsMagick ChangeLog</h1>
+<p>2024-12-16  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>config/delegates.mgk.in: Use XML predefined entities
+substitutions for '&amp;' and '&lt;' so that the file syntax is valid
+XML.  Older/existing files using &quot;invalid&quot; XML continue to be
+accepted.</p></li>
+<li><p>magick/delegate.c (ReadConfigureFile): Support XML predefined
+entities substitutions.</p></li>
+<li><p>magick/utility.c (SubstituteString): Fix off-by-one error which
+caused back-to-back substitions to not work correctly.</p></li>
+</ul>
+</blockquote>
 <p>2024-12-05  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">