GraphicsMagick: ReadJP2Image(): Switch back to using jas_image_d...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.9498.1643572126.1940.graphicsmagick-commit@lists.sourceforge.net>
changeset 523c681ea873 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=523c681ea873
summary: ReadJP2Image(): Switch back to using jas_image_decode()

diffstat:

 ChangeLog                              |   6 ++
 VisualMagick/installer/inc/version.isx |   4 +-
 coders/jp2.c                           |  88 +++++++++++++++----------------
 configure                              |  93 ++++++++++++++++++++++++++++++++-
 configure.ac                           |   4 +-
 magick/magick_config.h.in              |   9 ---
 magick/version.h                       |   4 +-
 www/Changelog.html                     |   5 +
 8 files changed, 149 insertions(+), 64 deletions(-)

diffs (351 lines):

diff -r f364bc76becf -r 523c681ea873 ChangeLog
--- a/ChangeLog	Fri Jan 28 14:26:25 2022 -0600
+++ b/ChangeLog	Sun Jan 30 13:48:31 2022 -0600
@@ -1,3 +1,9 @@
+2022-01-30  Bob Friesenhahn  <[email protected]>
+
+        * coders/jp2.c (ReadJP2Image): Jasper 3.0.0 hid the functions we
+        were using so switch back to using jas_image_decode(), but in a
+        more secure way than before.
+
 2022-01-28  Bob Friesenhahn  <[email protected]>
 
         * www/download.rst: Document how to retrieve the PGP signing key
diff -r f364bc76becf -r 523c681ea873 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Fri Jan 28 14:26:25 2022 -0600
+++ b/VisualMagick/installer/inc/version.isx	Sun Jan 30 13:48:31 2022 -0600
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020220128"
-#define public MagickPackageReleaseDate "snapshot-20220128"
+#define public MagickPackageVersionAddendum ".020220130"
+#define public MagickPackageReleaseDate "snapshot-20220130"
diff -r f364bc76becf -r 523c681ea873 coders/jp2.c
--- a/coders/jp2.c	Fri Jan 28 14:26:25 2022 -0600
+++ b/coders/jp2.c	Sun Jan 30 13:48:31 2022 -0600
@@ -834,46 +834,43 @@
                           "JP2 options = \"%s\"", options);
   }
 
-  /* JP2, JPC, PGX (J2C is an alias for JPC) */
-#if HAVE_JP2_DECODE
-  /* JPEG-2000 JP2 File Format Syntax */
-  if (jp2_hdr)
-    {
-      /* jas_image_t *jp2_decode(jas_stream_t *in, const char *optstr); */
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "Decoding JP2...");
-      jp2_image=jp2_decode(jp2_stream,options);
-    }
-#endif /* if HAVE_JP2_DECODE */
-#if HAVE_JPC_DECODE
-  /* JPEG-2000 Code Stream Syntax */
-  if (jpc_hdr)
-    {
-      /* jas_image_t *jpc_decode(jas_stream_t *in, const char *optstr); */
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "Decoding JPC...");
-      jp2_image=jpc_decode(jp2_stream,options);
-    }
-#endif /* if HAVE_JPC_DECODE */
-#if HAVE_PGX_DECODE
-  /* JPEG-2000 VM Format */
-  if (pgx_hdr)
-    {
-      /* jas_image_t *pgx_decode(jas_stream_t *in, const char *optstr); */
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "Decoding PGX...");
-      jp2_image=pgx_decode(jp2_stream,options);
-    }
-#endif /* if HAVE_PGX_DECODE */
+  /*
+    Decode
+  */
+  {
+    int
+      jas_fmt = -1;
+
+    const char *
+      jas_fmt_str = NULL;
+
+    if (jp2_hdr)
+      jas_fmt_str = "jp2";
+    else if (jpc_hdr)
+      jas_fmt_str = "jpc";
+    else if (pgx_hdr)
+      jas_fmt_str = "pgx";
+
+    if (jas_fmt_str != (const char *) NULL)
+      {
+        jas_fmt = jas_image_strtofmt(jas_fmt_str);
+        if (-1 != jas_fmt)
+          {
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                  "Decoding %s...", jas_fmt_str);
+            jp2_image=jas_image_decode(jp2_stream,jas_fmt,options);
+          }
+        else
+          {
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                                  "JasPer does not support format %s!",
+                                  jas_fmt_str);
+          }
+      }
+  }
 
   MagickFreeMemory(options);
 
-  /*
-    Using jas_image_decode() makes us subject to Jasper's own format
-    determination, which may include file formats we don't want to
-    support via Jasper.
-  */
-  /* jp2_image=jas_image_decode(jp2_stream,-1,options); */
   if (jp2_image == (jas_image_t *) NULL)
     ThrowJP2ReaderException(DelegateError,UnableToDecodeImageFile,image);
 
@@ -1195,7 +1192,7 @@
   (void) strlcpy(version,"JasPer ",sizeof(version));
   (void) strlcat(version,jas_getversion(),sizeof(version));
 
-#if HAVE_JPC_DECODE
+#if !defined(EXCLUDE_JP2_SUPPORT) || defined(JAS_ENABLE_JP2_CODEC)
   entry=SetMagickInfo("J2C");
   entry->description="JPEG-2000 Code Stream Syntax";
   entry->version=version;
@@ -1208,9 +1205,9 @@
   entry->encoder=(EncoderHandler) WriteJP2Image;
   entry->coder_class=StableCoderClass;
   (void) RegisterMagickInfo(entry);
-#endif /* if HAVE_JPC_DECODE */
+#endif /* !defined(EXCLUDE_JP2_SUPPORT) || defined(JAS_ENABLE_JP2_CODEC) */
 
-#if HAVE_JP2_DECODE
+#if !defined(EXCLUDE_JP2_SUPPORT) || defined(JAS_ENABLE_JP2_CODEC)
   entry=SetMagickInfo("JP2");
   entry->description="JPEG-2000 JP2 File Format Syntax";
   entry->version=version;
@@ -1223,9 +1220,9 @@
   entry->encoder=(EncoderHandler) WriteJP2Image;
   entry->coder_class=StableCoderClass;
   (void) RegisterMagickInfo(entry);
-#endif /* HAVE_JP2_DECODE */
+#endif /* !defined(EXCLUDE_JP2_SUPPORT) || defined(JAS_ENABLE_JP2_CODEC) */
 
-#if HAVE_JPC_DECODE
+#if !defined(EXCLUDE_JPC_SUPPORT) || defined(JAS_ENABLE_JPC_CODEC)
   entry=SetMagickInfo("JPC");
   entry->description="JPEG-2000 Code Stream Syntax";
   entry->version=version;
@@ -1238,9 +1235,9 @@
   entry->encoder=(EncoderHandler) WriteJP2Image;
   entry->coder_class=StableCoderClass;
   (void) RegisterMagickInfo(entry);
-#endif /* if HAVE_JPC_DECODE */
+#endif /* !defined(EXCLUDE_JPC_SUPPORT) || defined(JAS_ENABLE_JPC_CODEC) */
 
-#if HAVE_PGX_DECODE
+#if !defined(EXCLUDE_PGX_SUPPORT) || defined(JAS_ENABLE_PGX_CODEC)
   entry=SetMagickInfo("PGX");
   entry->description="JPEG-2000 VM Format";
   entry->version=version;
@@ -1253,7 +1250,8 @@
   entry->encoder=(EncoderHandler) WriteJP2Image;
   entry->coder_class=UnstableCoderClass;
   (void) RegisterMagickInfo(entry);
-#endif /* if HAVE_PGX_DECODE */
+#endif /* !defined(EXCLUDE_PGX_SUPPORT) || defined(JAS_ENABLE_PGX_CODEC) */
+
 #endif /* if defined(HasJP2) */
 }
 
diff -r f364bc76becf -r 523c681ea873 configure
--- a/configure	Fri Jan 28 14:26:25 2022 -0600
+++ b/configure	Sun Jan 30 13:48:31 2022 -0600
@@ -26159,6 +26159,90 @@
   failed=`expr $failed + 1`
 fi
 
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jas_image_strtofmt in -ljasper" >&5
+$as_echo_n "checking for jas_image_strtofmt in -ljasper... " >&6; }
+if ${ac_cv_lib_jasper_jas_image_strtofmt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljasper  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jas_image_strtofmt ();
+int
+main ()
+{
+return jas_image_strtofmt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_jasper_jas_image_strtofmt=yes
+else
+  ac_cv_lib_jasper_jas_image_strtofmt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jasper_jas_image_strtofmt" >&5
+$as_echo "$ac_cv_lib_jasper_jas_image_strtofmt" >&6; }
+if test "x$ac_cv_lib_jasper_jas_image_strtofmt" = xyes; then :
+  passed=`expr $passed + 1`
+else
+  failed=`expr $failed + 1`
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jas_image_decode in -ljasper" >&5
+$as_echo_n "checking for jas_image_decode in -ljasper... " >&6; }
+if ${ac_cv_lib_jasper_jas_image_decode+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljasper  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jas_image_decode ();
+int
+main ()
+{
+return jas_image_decode ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_jasper_jas_image_decode=yes
+else
+  ac_cv_lib_jasper_jas_image_decode=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jasper_jas_image_decode" >&5
+$as_echo "$ac_cv_lib_jasper_jas_image_decode" >&6; }
+if test "x$ac_cv_lib_jasper_jas_image_decode" = xyes; then :
+  passed=`expr $passed + 1`
+else
+  failed=`expr $failed + 1`
+fi
+
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking if JPEG version 2 support package is complete" >&5
 $as_echo_n "checking if JPEG version 2 support package is complete... " >&6; }
     if test $passed -gt 0
@@ -26177,13 +26261,12 @@
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
         have_jp2='yes'
-        for ac_func in jas_init_library jp2_decode jpc_decode pgx_decode
+        for ac_func in jas_init_library
 do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  ac_fn_c_check_func "$LINENO" "jas_init_library" "ac_cv_func_jas_init_library"
+if test "x$ac_cv_func_jas_init_library" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define HAVE_JAS_INIT_LIBRARY 1
 _ACEOF
 
 fi
diff -r f364bc76becf -r 523c681ea873 configure.ac
--- a/configure.ac	Fri Jan 28 14:26:25 2022 -0600
+++ b/configure.ac	Sun Jan 30 13:48:31 2022 -0600
@@ -2241,6 +2241,8 @@
     passed=0
     AC_CHECK_HEADER([jasper/jasper.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`])
     AC_CHECK_LIB([jasper],[jas_stream_fopen],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],)
+    AC_CHECK_LIB([jasper],[jas_image_strtofmt],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],)
+    AC_CHECK_LIB([jasper],[jas_image_decode],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],)
     AC_MSG_CHECKING([if JPEG version 2 support package is complete])
     if test $passed -gt 0
     then
@@ -2254,7 +2256,7 @@
         AC_DEFINE([HasJP2],[1],[Define if you have JPEG version 2 "Jasper" library])
         AC_MSG_RESULT([yes])
         have_jp2='yes'
-        AC_CHECK_FUNCS([jas_init_library jp2_decode jpc_decode pgx_decode])
+        AC_CHECK_FUNCS([jas_init_library])
     fi
     else
     AC_MSG_RESULT([no])
diff -r f364bc76becf -r 523c681ea873 magick/magick_config.h.in
--- a/magick/magick_config.h.in	Fri Jan 28 14:26:25 2022 -0600
+++ b/magick/magick_config.h.in	Sun Jan 30 13:48:31 2022 -0600
@@ -149,12 +149,6 @@
 /* Define to 1 if you have the `jas_init_library' function. */
 #undef HAVE_JAS_INIT_LIBRARY
 
-/* Define to 1 if you have the `jp2_decode' function. */
-#undef HAVE_JP2_DECODE
-
-/* Define to 1 if you have the `jpc_decode' function. */
-#undef HAVE_JPC_DECODE
-
 /* Define if you have the <lcms2.h> header file. */
 #undef HAVE_LCMS2_H
 
@@ -211,9 +205,6 @@
 /* Define to 1 if you have the `pclose' function. */
 #undef HAVE_PCLOSE
 
-/* Define to 1 if you have the `pgx_decode' function. */
-#undef HAVE_PGX_DECODE
-
 /* Define to 1 if you have the `poll' function. */
 #undef HAVE_POLL
 
diff -r f364bc76becf -r 523c681ea873 magick/version.h
--- a/magick/version.h	Fri Jan 28 14:26:25 2022 -0600
+++ b/magick/version.h	Sun Jan 30 13:48:31 2022 -0600
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x262300
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 26,23,0
-#define MagickChangeDate   "20220128"
-#define MagickReleaseDate  "snapshot-20220128"
+#define MagickChangeDate   "20220130"
+#define MagickReleaseDate  "snapshot-20220130"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r f364bc76becf -r 523c681ea873 www/Changelog.html
--- a/www/Changelog.html	Fri Jan 28 14:26:25 2022 -0600
+++ b/www/Changelog.html	Sun Jan 30 13:48:31 2022 -0600
@@ -35,6 +35,11 @@
 <div class="document">
 
 
+<p>2022-01-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>
+* coders/jp2.c (ReadJP2Image): Jasper 3.0.0 hid the functions we
+were using so switch back to using jas_image_decode(), but in a
+more secure way than before.</blockquote>
 <p>2022-01-28  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>
 * www/download.rst: Document how to retrieve the PGP signing key
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.