Commit 99711276a for imagemagick.org

commit 99711276aefec757dabb28ea8bf85bf504a0888c
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Thu May 14 19:26:01 2026 -0400

    https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-4g75-9r48-jf92

diff --git a/MagickCore/distribute-cache.c b/MagickCore/distribute-cache.c
index 43be88b4f..3bc07af5c 100644
--- a/MagickCore/distribute-cache.c
+++ b/MagickCore/distribute-cache.c
@@ -838,15 +838,14 @@ static MagickBooleanType WriteDistributeCachePixels(SplayTreeInfo *registry,
     return(MagickFalse);
   return(SyncAuthenticPixels(image,exception));
 }
-
-static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket)
+static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket_arg)
 {
   char
     *shared_secret;

   ExceptionInfo
     *exception;
-
+
   MagickBooleanType
     status = MagickFalse;

@@ -858,7 +857,8 @@ static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket)
     session_key;

   SOCKET_TYPE
-    client_socket;
+    client_socket,
+    *client_socket_ptr = (SOCKET_TYPE *) socket_arg;

   SplayTreeInfo
     *registry;
@@ -872,7 +872,9 @@ static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket)
   /*
     Generate session key.
   */
-  shared_secret=GetPolicyValue("cache:shared-secret");
+  client_socket=(*client_socket_ptr);
+  client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(client_socket_ptr);
+  shared_secret = GetPolicyValue("cache:shared-secret");
   if (shared_secret == (char *) NULL)
     ThrowFatalException(CacheFatalError,"shared secret required");
   nonce=StringToStringInfo(shared_secret);
@@ -885,7 +887,6 @@ static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket)
   */
   registry=NewSplayTree((int (*)(const void *,const void *)) NULL,
     (void *(*)(void *)) NULL,RelinquishImageRegistry);
-  client_socket=(*(SOCKET_TYPE *) socket);
   count=dpc_send(client_socket,sizeof(session_key),&session_key);
   for (status=MagickFalse; ; )
   {
@@ -936,9 +937,7 @@ static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket)
       default:
         break;
     }
-    if (status == MagickFalse)
-      break;
-    if (command == 'd')
+    if ((status == MagickFalse) || (command == 'd'))
       break;
   }
   count=dpc_send(client_socket,sizeof(status),&status);
@@ -962,7 +961,7 @@ MagickExport void DistributePixelCacheServer(const int port,
     attributes;

   pthread_t
-    threads;
+    thread_id;
 #elif defined(_MSC_VER)
   DWORD
     threadID;
@@ -970,12 +969,12 @@ MagickExport void DistributePixelCacheServer(const int port,
   Not implemented!
 #endif

-  struct addrinfo
-    *p;
-
   SOCKET_TYPE
     server_socket;

+  struct addrinfo
+    *p;
+
   struct addrinfo
     hint,
     *result;
@@ -992,24 +991,23 @@ MagickExport void DistributePixelCacheServer(const int port,
 #if defined(MAGICKCORE_HAVE_WINSOCK2)
   InitializeWinsock2(MagickFalse);
 #endif
-  (void) memset(&hint,0,sizeof(hint));
+  memset(&hint,0,sizeof(hint));
   hint.ai_family=AF_INET;
   hint.ai_socktype=SOCK_STREAM;
   hint.ai_flags=AI_PASSIVE;
-  (void) FormatLocaleString(service,MagickPathExtent,"%d",port);
-  status=getaddrinfo((const char *) NULL,service,&hint,&result);
+  FormatLocaleString(service,MagickPathExtent,"%d",port);
+  status=getaddrinfo(NULL,service,&hint,&result);
   if (status != 0)
-    ThrowFatalException(CacheFatalError,"UnableToListen");
+    ThrowFatalException(CacheFatalError, "UnableToListen");
   server_socket=(SOCKET_TYPE) 0;
-  for (p=result; p != (struct addrinfo *) NULL; p=p->ai_next)
+  for (p=result; p != NULL; p=p->ai_next)
   {
     int
-      one;
+      one = 1;

     server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
     if (server_socket == -1)
       continue;
-    one=1;
     status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(char *) &one,
       (socklen_t) sizeof(one));
     if (status == -1)
@@ -1033,27 +1031,43 @@ MagickExport void DistributePixelCacheServer(const int port,
     ThrowFatalException(CacheFatalError,"UnableToListen");
 #if defined(MAGICKCORE_THREAD_SUPPORT)
   pthread_attr_init(&attributes);
+  pthread_attr_setdetachstate(&attributes,PTHREAD_CREATE_DETACHED);
 #endif
   for ( ; ; )
   {
     SOCKET_TYPE
-      client_socket;
+     *client_socket_ptr;

     socklen_t
-      length;
-
-    length=(socklen_t) sizeof(address);
-    client_socket=accept(server_socket,(struct sockaddr *) &address,&length);
-    if (client_socket == -1)
-      ThrowFatalException(CacheFatalError,"UnableToEstablishConnection");
+      length = (socklen_t) sizeof(address);
+
+    client_socket_ptr=(SOCKET_TYPE *) AcquireMagickMemory(sizeof(SOCKET_TYPE));
+    if (client_socket_ptr == NULL)
+      continue;  /* skip connection */
+    *client_socket_ptr=accept(server_socket,(struct sockaddr *) &address,
+      &length);
+    if (*client_socket_ptr == -1)
+      {
+        client_socket_ptr=(SOCKET_TYPE *) RelinquishMagickMemory(
+          client_socket_ptr);
+        continue;
+      }
 #if defined(MAGICKCORE_THREAD_SUPPORT)
-    status=pthread_create(&threads,&attributes,DistributePixelCacheClient,
-      (void *) &client_socket);
-    if (status == -1)
-      ThrowFatalException(CacheFatalError,"UnableToCreateClientThread");
+    status=pthread_create(&thread_id, &attributes,DistributePixelCacheClient,
+      (void *) client_socket_ptr);
+    if (status != 0)
+      {
+        CLOSE_SOCKET(*client_socket_ptr);
+        RelinquishMagickMemory(client_socket_ptr);
+        ThrowFatalException(CacheFatalError,"UnableToCreateClientThread");
+      }
 #elif defined(_MSC_VER)
-    if (CreateThread(0,0,DistributePixelCacheClient,(void*) &client_socket,0,&threadID) == (HANDLE) NULL)
-      ThrowFatalException(CacheFatalError,"UnableToCreateClientThread");
+    if (CreateThread(0,0,DistributePixelCacheClient,(void*) client_socket_ptr,0,&threadID) == (HANDLE) NULL)
+      {
+        CLOSE_SOCKET(*client_socket_ptr);
+        RelinquishMagickMemory(client_socket_ptr);
+        ThrowFatalException(CacheFatalError,"UnableToCreateClientThread");
+      }
 #else
     Not implemented!
 #endif