Commit 017a8363a for imagemagick.org

commit 017a8363ac60affd2c1032aaa57177521c653ccf
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sat Feb 14 07:26:10 2026 -0500

    avoid deadly embrace for recursive MSL/SVG

diff --git a/MagickCore/constitute.c b/MagickCore/constitute.c
index 43453c64a..f57f4656f 100644
--- a/MagickCore/constitute.c
+++ b/MagickCore/constitute.c
@@ -735,14 +735,14 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
         Call appropriate image reader based on image type.
       */
       if (GetMagickDecoderThreadSupport(magick_info) == MagickFalse)
-        LockSemaphoreInfo(read_info->semaphore);
+        LockSemaphoreInfo(magick_info->semaphore);
       status=IsCoderAuthorized(magick_info->magick_module,read_info->magick,
         ReadPolicyRights,exception);
       image=(Image *) NULL;
       if (status != MagickFalse)
         image=decoder(read_info,exception);
       if (GetMagickDecoderThreadSupport(magick_info) == MagickFalse)
-        UnlockSemaphoreInfo(read_info->semaphore);
+        UnlockSemaphoreInfo(magick_info->semaphore);
     }
   else
     {
@@ -770,11 +770,11 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
         MagickPathExtent);
       *read_info->filename='\0';
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-        LockSemaphoreInfo(read_info->semaphore);
+        LockSemaphoreInfo(delegate_info->semaphore);
       status=InvokeDelegate(read_info,image,read_info->magick,(char *) NULL,
         exception);
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-        UnlockSemaphoreInfo(read_info->semaphore);
+        UnlockSemaphoreInfo(delegate_info->semaphore);
       image=DestroyImageList(image);
       read_info->temporary=MagickTrue;
       if (status != MagickFalse)
@@ -797,14 +797,14 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
         Call appropriate image reader based on image type.
       */
       if (GetMagickDecoderThreadSupport(magick_info) == MagickFalse)
-        LockSemaphoreInfo(read_info->semaphore);
+        LockSemaphoreInfo(magick_info->semaphore);
       status=IsCoderAuthorized(magick_info->magick_module,read_info->magick,
         ReadPolicyRights,exception);
       image=(Image *) NULL;
       if (status != MagickFalse)
         image=(decoder)(read_info,exception);
       if (GetMagickDecoderThreadSupport(magick_info) == MagickFalse)
-        UnlockSemaphoreInfo(read_info->semaphore);
+        UnlockSemaphoreInfo(magick_info->semaphore);
     }
   if (read_info->temporary != MagickFalse)
     {
@@ -1339,13 +1339,13 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
         Call appropriate image writer based on image type.
       */
       if (GetMagickEncoderThreadSupport(magick_info) == MagickFalse)
-        LockSemaphoreInfo(write_info->semaphore);
+        LockSemaphoreInfo(magick_info->semaphore);
       status=IsCoderAuthorized(magick_info->magick_module,write_info->magick,
         WritePolicyRights,exception);
       if (status != MagickFalse)
         status=encoder(write_info,image,exception);
       if (GetMagickEncoderThreadSupport(magick_info) == MagickFalse)
-        UnlockSemaphoreInfo(write_info->semaphore);
+        UnlockSemaphoreInfo(magick_info->semaphore);
     }
   else
     {
@@ -1357,11 +1357,11 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
           */
           *write_info->filename='\0';
           if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-            LockSemaphoreInfo(write_info->semaphore);
+            LockSemaphoreInfo(delegate_info->semaphore);
           status=InvokeDelegate(write_info,image,(char *) NULL,
             write_info->magick,exception);
           if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
-            UnlockSemaphoreInfo(write_info->semaphore);
+            UnlockSemaphoreInfo(delegate_info->semaphore);
           (void) CopyMagickString(image->filename,filename,MagickPathExtent);
         }
       else
@@ -1411,13 +1411,13 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
                 Call appropriate image writer based on image type.
               */
               if (GetMagickEncoderThreadSupport(magick_info) == MagickFalse)
-                LockSemaphoreInfo(write_info->semaphore);
-              status=IsCoderAuthorized(magick_info->magick_module,
-                write_info->magick,WritePolicyRights,exception);
+                LockSemaphoreInfo(magick_info->semaphore);
+              status=IsCoderAuthorized(magick_info->magick_module,write_info->magick,
+                WritePolicyRights,exception);
               if (status != MagickFalse)
                 status=encoder(write_info,image,exception);
               if (GetMagickEncoderThreadSupport(magick_info) == MagickFalse)
-                UnlockSemaphoreInfo(write_info->semaphore);
+                UnlockSemaphoreInfo(magick_info->semaphore);
             }
         }
     }
diff --git a/MagickCore/image.c b/MagickCore/image.c
index c27320b65..34d6104b3 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -1287,8 +1287,6 @@ MagickExport ImageInfo *DestroyImageInfo(ImageInfo *image_info)
     image_info->profile=(void *) DestroyStringInfo((StringInfo *)
       image_info->profile);
   DestroyImageOptions(image_info);
-  if (image_info->semaphore != (SemaphoreInfo *) NULL)
-    RelinquishSemaphoreInfo(&image_info->semaphore);
   image_info->signature=(~MagickCoreSignature);
   image_info=(ImageInfo *) RelinquishMagickMemory(image_info);
   return(image_info);
@@ -1380,7 +1378,6 @@ MagickExport void GetImageInfo(ImageInfo *image_info)
   GetPixelInfoRGBA(TransparentColorRGBA,&image_info->transparent_color);
   image_info->debug=(GetLogEventMask() & ImageEvent) != 0 ? MagickTrue :
     MagickFalse;
-  image_info->semaphore=AcquireSemaphoreInfo();
   image_info->signature=MagickCoreSignature;
 }

diff --git a/MagickCore/image.h b/MagickCore/image.h
index e3ba12648..bbc3dfe33 100644
--- a/MagickCore/image.h
+++ b/MagickCore/image.h
@@ -475,9 +475,6 @@ struct _ImageInfo

   PixelInfo
     matte_color;        /* matte (frame) color */
-
-  SemaphoreInfo
-    *semaphore;
 };

 extern MagickExport ChannelType
diff --git a/MagickCore/magick.h b/MagickCore/magick.h
index 7a7e1e860..82b17d911 100644
--- a/MagickCore/magick.h
+++ b/MagickCore/magick.h
@@ -145,7 +145,7 @@ extern const MagickExport MagickInfo
   **GetMagickInfoList(const char *,size_t *,ExceptionInfo *);

 extern MagickExport MagickInfo
-  *AcquireMagickInfo(const char *, const char *, const char *);
+  *AcquireMagickInfo(const char *,const char *,const char *);

 extern MagickExport void
   MagickCoreGenesis(const char *,const MagickBooleanType),
diff --git a/coders/msl.c b/coders/msl.c
index e93700264..4e881b132 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -7563,7 +7563,6 @@ ModuleExport size_t RegisterMSLImage(void)
   entry->decoder=(DecodeImageHandler *) ReadMSLImage;
   entry->encoder=(EncodeImageHandler *) WriteMSLImage;
 #endif
-  entry->flags^=CoderDecoderThreadSupportFlag;
   entry->format_type=ImplicitFormatType;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
diff --git a/coders/svg.c b/coders/svg.c
index 02f08cca7..bf540357d 100644
--- a/coders/svg.c
+++ b/coders/svg.c
@@ -3421,7 +3421,6 @@ ModuleExport size_t RegisterSVGImage(void)
   entry->decoder=(DecodeImageHandler *) ReadSVGImage;
 #endif
   entry->encoder=(EncodeImageHandler *) WriteSVGImage;
-  entry->flags^=CoderDecoderThreadSupportFlag;
   entry->magick=(IsImageFormatHandler *) IsSVG;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);