Fix possible endless loop due to dying spamd
authorTom Kistner <tom@duncanthrax.net>
Fri, 10 Jun 2005 13:29:36 +0000 (13:29 +0000)
committerTom Kistner <tom@duncanthrax.net>
Fri, 10 Jun 2005 13:29:36 +0000 (13:29 +0000)
src/src/dns.c
src/src/lookups/dnsdb.c
src/src/spam.c

index c6cd706..e738172 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/dns.c,v 1.6 2005/05/10 10:19:11 ph10 Exp $ */
+/* $Cambridge: exim/src/src/dns.c,v 1.7 2005/06/10 13:29:36 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -556,6 +556,8 @@ for (i = 0; i < 10; i++)
   contents of any rr blocks returned by dns_next_rr() as they use the same
   area in the dnsa block. */
 
+  DEBUG(D_dns) debug_printf("Back in dns_lookup()\n");
+
   cname_rr.data = type_rr.data = NULL;
   for (rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS);
        rr != NULL;
index 8133506..17bffba 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.11 2005/05/10 10:19:11 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.12 2005/06/10 13:29:36 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -260,6 +260,8 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
   found = domain;
   rc = dns_special_lookup(&dnsa, domain, type, &found);
 
+  DEBUG(D_lookup) debug_printf("Back in dnsdb_find\n");
+
   if (rc == DNS_NOMATCH || rc == DNS_NODATA) continue;
   if (rc != DNS_SUCCEED)
     {
index 3c70f6d..5641459 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/spam.c,v 1.6 2005/05/10 22:39:20 tom Exp $ */
+/* $Cambridge: exim/src/src/spam.c,v 1.7 2005/06/10 13:29:36 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -247,6 +247,14 @@ again:
       }
 #endif
       wrote = send(spamd_sock,spamd_buffer + offset,read - offset,0);
+      if (wrote == -1)
+      {
+          log_write(0, LOG_MAIN|LOG_PANIC,
+            "spam acl condition: %s on spamd socket", strerror(errno));
+        close(spamd_sock);
+        fclose(mbox_file);
+        return DEFER;
+      }
       if (offset + wrote != read) {
         offset += wrote;
         goto again;