Commit c421b337a for imagemagick.org

commit c421b337a7bbd43f66b5b4929c79dffecb994df0
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sat May 16 18:38:09 2026 -0400

    fixes per minor code review

diff --git a/MagickCore/distribute-cache-private.h b/MagickCore/distribute-cache-private.h
index 4b602a450..f78166867 100644
--- a/MagickCore/distribute-cache-private.h
+++ b/MagickCore/distribute-cache-private.h
@@ -27,7 +27,7 @@ extern "C" {

 typedef struct _DistributeCacheInfo
 {
-  int
+  SOCKET_TYPE
     file;

   uint64_t
diff --git a/MagickCore/distribute-cache.c b/MagickCore/distribute-cache.c
index 0aef5675e..7eb6dd66b 100644
--- a/MagickCore/distribute-cache.c
+++ b/MagickCore/distribute-cache.c
@@ -55,7 +55,6 @@
 #include "MagickCore/cache.h"
 #include "MagickCore/cache-private.h"
 #include "MagickCore/distribute-cache.h"
-#include "MagickCore/distribute-cache-private.h"
 #include "MagickCore/exception.h"
 #include "MagickCore/exception-private.h"
 #include "MagickCore/geometry.h"
@@ -89,6 +88,7 @@
 #define SOCKET_TYPE int
 #define LENGTH_TYPE size_t
 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
+#include "MagickCore/distribute-cache-private.h"
 #elif defined(_MSC_VER)
 #define CLOSE_SOCKET(socket) (void) closesocket(socket)
 #define HANDLER_RETURN_TYPE DWORD WINAPI
@@ -98,6 +98,7 @@
 #define LENGTH_TYPE int
 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE 1
 #define MAGICKCORE_HAVE_WINSOCK2 1
+#include "MagickCore/distribute-cache-private.h"
 #endif
 #endif

@@ -203,7 +204,7 @@ static void InitializeWinsock2(MagickBooleanType use_lock)
 #endif

 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
-static int ConnectPixelCacheServer(const char *magick_unused(hostname),
+static SOCKET_TYPE ConnectPixelCacheServer(const char *magick_unused(hostname),
   const int magick_unused(port),uint64_t *magick_unused(session_key),
   ExceptionInfo *exception)
 {
@@ -327,7 +328,7 @@ static inline uint64_t GenerateSessionKey(const char *shared_secret,
   return(SIPHash24(key,nonce,length));
 }

-static int ConnectPixelCacheServer(const char *hostname,const int port,
+static SOCKET_TYPE ConnectPixelCacheServer(const char *hostname,const int port,
   uint64_t *session_key,ExceptionInfo *exception)
 {
 #if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
@@ -367,7 +368,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
   if (status != 0)
     {
       (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
-        "DistributedPixelCache","'%s': %s",hostname,GetExceptionMessage(errno));
+        "DistributedPixelCache","'%s': %s",hostname,gai_strerror(status));
       return(-1);
     }
   client_socket=socket(result->ai_family,result->ai_socktype,
@@ -400,7 +401,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
       return(-1);
     }
   /*
-    Compute HMAC(shared_secret,nonce).
+    Compute keyed hash(shared_secret,nonce).
   */
   shared_secret=GetPolicyValue("cache:shared-secret");
   if (shared_secret == (char*) NULL)
@@ -413,7 +414,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
   *session_key=GenerateSessionKey(shared_secret,nonce,sizeof(nonce));
   shared_secret=DestroyString(shared_secret);
   /*
-    Send HMAC back to client.
+    Send keyed hash back to client.
   */
   count=send(client_socket,(char *) session_key,sizeof(*session_key),
     MSG_NOSIGNAL);
@@ -424,7 +425,7 @@ static int ConnectPixelCacheServer(const char *hostname,const int port,
         "DistributedPixelCache","'%s': authentication failed",hostname);
       return(-1);
     }
-  return((int) client_socket);
+  return(client_socket);
 #else
   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
     "DelegateLibrarySupportNotBuiltIn","distributed pixel cache");
@@ -466,7 +467,11 @@ static char *GetHostname(int *port,ExceptionInfo *exception)
       *port=DPCPort;
       return(AcquireString(DPCHostname));
     }
-  hosts=AcquireString(hostlist[(id++ % ((size_t) argc-1))+1]);
+  {
+    size_t host_count = (size_t) argc-1;
+    size_t index = (id++ % host_count)+1;
+    hosts=AcquireString(hostlist[index]);
+  }
   for (i=0; i < (ssize_t) argc; i++)
     hostlist[i]=DestroyString(hostlist[i]);
   hostlist=(char **) RelinquishMagickMemory(hostlist);
@@ -555,7 +560,7 @@ MagickPrivate DistributeCacheInfo *DestroyDistributeCacheInfo(
   assert(server_info != (DistributeCacheInfo *) NULL);
   assert(server_info->signature == MagickCoreSignature);
 #if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
-  if (server_info->file > 0)
+  if (server_info->file >= 0)
     CLOSE_SOCKET(server_info->file);
 #endif
   server_info->signature=(~MagickCoreSignature);
@@ -684,7 +689,10 @@ static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
     sizeof(*image->channel_map)+sizeof(image->metacontent_extent);
   count=dpc_read(file,length,message);
   if (count != (MagickOffsetType) length)
-    return(MagickFalse);
+    {
+      image=DestroyImage(image);
+      return(MagickFalse);
+    }
   /*
     Deserialize the image attributes.
   */
@@ -709,8 +717,16 @@ static MagickBooleanType OpenDistributeCache(SplayTreeInfo *registry,
   (void) memcpy(&image->metacontent_extent,p,sizeof(image->metacontent_extent));
   p+=(ptrdiff_t) sizeof(image->metacontent_extent);
   if (SyncImagePixelCache(image,exception) == MagickFalse)
-    return(MagickFalse);
+    {
+      image=DestroyImage(image);
+      return(MagickFalse);
+    }
   status=AddValueToSplayTree(registry,(const void *) key,image);
+  if (status == MagickFalse)
+    {
+      image=DestroyImage(image);
+      return(MagickFalse);
+    }
   return(status);
 }

@@ -1061,7 +1077,7 @@ static HANDLER_RETURN_TYPE DistributePixelCacheClient(void *socket_arg)
       return(HANDLER_RETURN_VALUE);
     }
   /*
-    Receive client's HMAC.
+    Receive client's keyed hash.
   */
   count=dpc_read(client_socket,sizeof(key),(unsigned char *) &key);
   if ((count != (MagickOffsetType) sizeof(key)) || (key != session_key))
@@ -1200,6 +1216,19 @@ MagickExport void DistributePixelCacheServer(const int port,
       continue;
     status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(char *) &one,
       (socklen_t) sizeof(one));
+    if (status != -1)
+      {
+#if defined(MAGICKCORE_HAVE_WINSOCK2)
+        DWORD timeout = 5000; // ms
+        status=setsockopt(server_socket,SOL_SOCKET,SO_RCVTIMEO,(const char *)
+          &timeout,sizeof(timeout));
+#else
+        struct timeval tv;
+        tv.tv_sec=5;
+        tv.tv_usec=0;
+        status=setsockopt(server_socket,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));
+#endif
+      }
     if (status == -1)
       {
         CLOSE_SOCKET(server_socket);