Add timeout to connect() for Unix domain socket in ${readsocket.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 13 Nov 2006 12:29:30 +0000 (12:29 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 13 Nov 2006 12:29:30 +0000 (12:29 +0000)
doc/doc-txt/ChangeLog
src/src/expand.c

index 1ac335408615beb5ca29472cf89fc8050cf86fa7..01ff8dc3cd6a5e3462db2987a9d53f469385fe41 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.432 2006/11/13 12:07:46 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.433 2006/11/13 12:29:30 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -271,6 +271,9 @@ PH/43 Renamed the variables $interface_address and $interface_port as
       values apply to message reception, and not to the outgoing interface when
       a message is delivered. (The old names remain recognized, of course.)
 
+PH/44 There was no timeout on the connect() call when using a Unix domain
+      socket in the ${readsocket expansion. There now is.
+
 
 Exim version 4.63
 -----------------
index d049466f1897c264783e42068f1eb44388d96270..234a33ff52a125bfc3f234d2df19dab433b77f54 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.70 2006/11/13 12:07:46 ph10 Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.71 2006/11/13 12:29:30 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -3914,6 +3914,7 @@ while (*s != 0)
 
         else
           {
+          int rc;
           if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
             {
             expand_string_message = string_sprintf("failed to create socket: %s",
@@ -3924,12 +3925,22 @@ while (*s != 0)
           sockun.sun_family = AF_UNIX;
           sprintf(sockun.sun_path, "%.*s", (int)(sizeof(sockun.sun_path)-1),
             sub_arg[0]);
-          if(connect(fd, (struct sockaddr *)(&sockun), sizeof(sockun)) == -1)
+
+          sigalrm_seen = FALSE;
+          alarm(timeout);
+          rc = connect(fd, (struct sockaddr *)(&sockun), sizeof(sockun));
+          alarm(0);
+          if (rc < 0)
             {
             expand_string_message = string_sprintf("failed to connect to socket "
               "%s: %s", sub_arg[0], strerror(errno));
             goto SOCK_FAIL;
             }
+          if (sigalrm_seen)
+            {
+            expand_string_message = US "socket connect timed out";
+            goto SOCK_FAIL;
+            }
           }
 
         DEBUG(D_expand) debug_printf("connected to socket %s\n", sub_arg[0]);