Commit 727ddc924 for imagemagick.org

commit 727ddc924c1455c5a2bfc57758b619d2baa3fec4
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Tue Jun 23 09:04:44 2026 -0400

    support coder strict streaming attribute

diff --git a/MagickCore/constitute-private.h b/MagickCore/constitute-private.h
index a283f7429..45ca0842c 100644
--- a/MagickCore/constitute-private.h
+++ b/MagickCore/constitute-private.h
@@ -25,27 +25,10 @@ extern "C" {
 #include "MagickCore/constitute.h"
 #include "MagickCore/exception.h"
 #include "MagickCore/log.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/magick-private.h"
 #include "MagickCore/utility.h"

-static inline MagickBooleanType IsAllowedCoder(const char *coder)
-{
-  static const char
-    *allowed_coders[] = {
-     "MPR",
-     "MPRI",
-     NULL
-   };
-
-  const char **p = allowed_coders;
-  while (*p != NULL)
-  {
-    if (LocaleCompare(coder,*p) == 0)
-      return(MagickTrue);
-    p++;
-  }
-  return(MagickFalse);
-}
-
 static inline Image *StrictReadImage(const ImageInfo *image_info,
   ExceptionInfo *exception)
 {
@@ -55,10 +38,11 @@ static inline Image *StrictReadImage(const ImageInfo *image_info,
   (void) GetPathComponent(image_info->filename,MagickPath,magic);
   if (*magic != '\0')
     {
-      LocaleUpper(magic);
-      if (IsAllowedCoder(magic) == MagickFalse)
+      const MagickInfo *magick_info = GetMagickInfo(magic,exception);
+      if ((magick_info == (const MagickInfo *) NULL) ||
+          (GetMagickStrictStream(magick_info) != MagickFalse))
         {
-          (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
+          (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
             "ExplicitCoderNotAllowed","`%s'",image_info->filename);
           return((Image *) NULL);
         }
diff --git a/MagickCore/magick-private.h b/MagickCore/magick-private.h
index 290828676..c5d61254e 100644
--- a/MagickCore/magick-private.h
+++ b/MagickCore/magick-private.h
@@ -22,6 +22,15 @@
 extern "C" {
 #endif

+static inline MagickBooleanType GetMagickStrictStream(
+  const MagickInfo *magick_info)
+{
+  assert(magick_info != (MagickInfo *) NULL);
+  assert(magick_info->signature == MagickCoreSignature);
+  return(((magick_info->flags & CoderStrictStreamFlag) == 0) ? MagickFalse :
+    MagickTrue);
+}
+
 extern MagickPrivate MagickBooleanType
   IsMagickConflict(const char *),
   MagickComponentGenesis(void);
diff --git a/MagickCore/magick.c b/MagickCore/magick.c
index a72fd8241..59c16099e 100644
--- a/MagickCore/magick.c
+++ b/MagickCore/magick.c
@@ -187,7 +187,7 @@ MagickExport MagickInfo *AcquireMagickInfo(const char *magick_module,
   magick_info->description=ConstantString(description);
   magick_info->flags=CoderAdjoinFlag | CoderBlobSupportFlag |
     CoderDecoderThreadSupportFlag | CoderEncoderThreadSupportFlag |
-    CoderUseExtensionFlag;
+    CoderUseExtensionFlag | CoderStrictStreamFlag;
   magick_info->signature=MagickCoreSignature;
   return(magick_info);
 }
diff --git a/MagickCore/magick.h b/MagickCore/magick.h
index 82b17d911..265ff2952 100644
--- a/MagickCore/magick.h
+++ b/MagickCore/magick.h
@@ -51,7 +51,8 @@ typedef enum
   CoderStealthFlag = 0x0080,
   CoderUseExtensionFlag = 0x0100,
   CoderDecoderSeekableStreamFlag = 0x0200,
-  CoderEncoderSeekableStreamFlag = 0x0400
+  CoderEncoderSeekableStreamFlag = 0x0400,
+  CoderStrictStreamFlag = 0x0800
 } MagickInfoFlag;

 typedef Image
diff --git a/coders/inline.c b/coders/inline.c
index f1abf09db..9ee14ab6b 100644
--- a/coders/inline.c
+++ b/coders/inline.c
@@ -211,11 +211,13 @@ ModuleExport size_t RegisterINLINEImage(void)
   entry->decoder=(DecodeImageHandler *) ReadINLINEImage;
   entry->encoder=(EncodeImageHandler *) WriteINLINEImage;
   entry->format_type=ImplicitFormatType;
+  entry->flags^=CoderStrictStreamFlag;
   (void) RegisterMagickInfo(entry);
   entry=AcquireMagickInfo("INLINE","INLINE","Base64-encoded inline images");
   entry->decoder=(DecodeImageHandler *) ReadINLINEImage;
   entry->encoder=(EncodeImageHandler *) WriteINLINEImage;
   entry->format_type=ImplicitFormatType;
+  entry->flags^=CoderStrictStreamFlag;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
 }
diff --git a/coders/mpr.c b/coders/mpr.c
index cba098c5a..62996d201 100644
--- a/coders/mpr.c
+++ b/coders/mpr.c
@@ -140,16 +140,18 @@ ModuleExport size_t RegisterMPRImage(void)
   entry=AcquireMagickInfo("MPR","MPR","Magick Persistent Registry");
   entry->decoder=(DecodeImageHandler *) ReadMPRImage;
   entry->encoder=(EncodeImageHandler *) WriteMPRImage;
-  entry->flags^=CoderAdjoinFlag;
   entry->format_type=ImplicitFormatType;
   entry->flags|=CoderStealthFlag;
+  entry->flags^=CoderAdjoinFlag;
+  entry->flags^=CoderStrictStreamFlag;
   (void) RegisterMagickInfo(entry);
   entry=AcquireMagickInfo("MPR","MPRI","Magick Persistent Registry");
   entry->decoder=(DecodeImageHandler *) ReadMPRImage;
   entry->encoder=(EncodeImageHandler *) WriteMPRImage;
-  entry->flags^=CoderAdjoinFlag;
   entry->format_type=ImplicitFormatType;
   entry->flags|=CoderStealthFlag;
+  entry->flags^=CoderStrictStreamFlag;
+  entry->flags^=CoderAdjoinFlag;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
 }
diff --git a/config/english.xml b/config/english.xml
index 816fde5b6..71dad49d5 100644
--- a/config/english.xml
+++ b/config/english.xml
@@ -506,6 +506,9 @@
         <message name="ColorspaceColorProfileMismatch">
           color profile operates on another colorspace
         </message>
+        <message name="ExplicitCoderNotAllowed">
+          explicit coder not allowed
+        </message>
         <message name="ImageDepthNotSupported">
           image depth not supported
         </message>
diff --git a/config/francais.xml b/config/francais.xml
index a4b8da5f9..a1f880688 100644
--- a/config/francais.xml
+++ b/config/francais.xml
@@ -513,6 +513,9 @@
         <message name="ColorspaceColorProfileMismatch">
           Le profil colorimétrique ne peut fonctionner que dans un autre espace colorimétrique
         </message>
+        <message name="ExplicitCoderNotAllowed">
+          explicit coder not allowed
+        </message>
         <message name="ImageColorspaceDiffers">
           différences dans les espaces colorimétriques de l'image
         </message>