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>