Go to 20 ACL variables of each type, and make the numbers changeable at
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 12 Dec 2005 15:58:53 +0000 (15:58 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 12 Dec 2005 15:58:53 +0000 (15:58 +0000)
compile time.

15 files changed:
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
doc/doc-txt/OptionLists.txt
src/ACKNOWLEDGMENTS
src/README.UPDATING
src/exim_monitor/em_globals.c
src/src/acl.c
src/src/config.h.defaults
src/src/expand.c
src/src/globals.c
src/src/globals.h
src/src/macros.h
src/src/smtp_in.c
src/src/spool_in.c
src/src/spool_out.c

index 83b4de2d71d0bbc4d7381d08b7c58f93718824eb..822795ba74cfc4b1b77e79cf00f655dfa4290205 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.273 2005/12/12 11:41:50 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.274 2005/12/12 15:58:53 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -29,6 +29,12 @@ PH/04 Changed $reply_address to use the raw form of the headers instead of the
 PH/05 If group was specified without a user on a router, and no group or user
       was specified on a transport, the group from the router was ignored.
 
+PH/06 Increased the number of ACL variables to 20 of each type, and arranged
+      for visible compile-time settings that can be used to change these
+      numbers, for those that want even more. Backwards compatibility with old
+      spool files has been maintained. However, going back to a previous Exim
+      release will lost any variables that are in spool files.
+
 
 Exim version 4.60
 -----------------
index 4d0863d7f063766605e7c11530465a974fb04089..2aab4af8d85fbce10429211ee1af3d69a51a52f2 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.79 2005/12/12 11:02:44 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.80 2005/12/12 15:58:53 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -20,6 +20,14 @@ PH/01 There is a new global option called disable_ipv6, which does exactly what
       data, etc. are also ignored. If IP literals are enabled, the ipliteral
       router declines to handle IPv6 literal addresses.
 
+PH/01 There are now 20 of each type of ACL variable by default (instead of 10).
+      It is also possible to change the numbers by setting ACL_CVARS and/or
+      ACL_MVARS in Local/Makefile. Backward compatibility is maintained if you
+      upgrade to this release with existing messages containing ACL variable
+      settings on the queue. However, going in the other direction
+      (downgrading) will not be compatible; the values of ACL variables will be
+      lost.
+
 
 Version 4.60
 ------------
index ce794faca870f4fe02200ea23141fa103842f902..9bb1173d1ff8b42d83a2050ab661e7ea53af1c09 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.13 2005/12/06 10:25:59 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.14 2005/12/12 15:58:53 ph10 Exp $
 
 LISTS OF EXIM OPTIONS
 ---------------------
@@ -735,6 +735,8 @@ to stop you overriding it in your Local/Makefile.
 Option                       Type         Description
 ------------------------------------------------------------------------------
 
+ACL_CVARS=20                 optional*    number of acl_c variables
+ACL_MVARS=20                 optional*    number of acl_m variables
 ALT_CONFIG_PREFIX            optional     restricts location of -C files
 ALT_CONFIG_ROOT_ONLY         optional*    privileged -C needs root (not exim)
 APPENDFILE_MODE              optional*
index e4b9ee1b731877924ad6a0a184aa5751a1b4df6c..54b7da04476bd88c3b00d9738650b83c4d250ccf 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.38 2005/11/15 10:08:25 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.39 2005/12/12 15:58:53 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  15 November 2005
+Last updated:  12 December 2005
 
 
 THE OLD LIST
@@ -210,6 +210,7 @@ Alexander Sabourenkov     Patch to add saslauthd daemon support
                           Patch for MySQL non-data queries
 David Saez                Suggested patch for $sender_hostname lookup if needed
                           Support for the clamd virus scanner
+                          Suggested patch for increased number of ACL variables
 Jonathan Sambrook         Suggested patch for expanding uid and gid lists
 Peter Savitch             Diagnosis of FPE bug when statvfs() fails on spool
 Harald Schueler           Patch for dn_expand() failure on truncated data
index fb599d38405015bd87e3a74404fcf555c238b88a..cfcc0837530df8d3deaa029e7dad00934f82c45b 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/README.UPDATING,v 1.9 2005/10/03 13:25:32 ph10 Exp $
+$Cambridge: exim/src/README.UPDATING,v 1.10 2005/12/12 15:58:53 ph10 Exp $
 
 This document contains detailed information about incompatibilities that might
 be encountered when upgrading from one release of Exim to another. The
@@ -28,6 +28,16 @@ The rest of this document contains information about changes in 4.xx releases
 that might affect a running system.
 
 
+Exim version 4.61
+-----------------
+
+The default number of ACL variables of each type has been increased to 20, and
+it's possible to compile Exim with more. You can safely upgrade to this release
+if you already have messages on the queue with saved ACL variable values.
+However, if you downgrade from this release with messages on the queue, any
+saved ACL values they may have will be lost.
+
+
 Exim version 4.54
 -----------------
 
index 761e4759514945c93b9e62df9de16a1b73b5a38a..209c44d941b5ed5b34be55973aed152fc590fc1c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/exim_monitor/em_globals.c,v 1.7 2005/05/23 15:28:38 fanf2 Exp $ */
+/* $Cambridge: exim/src/exim_monitor/em_globals.c,v 1.8 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *                Exim Monitor                    *
@@ -118,7 +118,7 @@ that fires up the monitor fishes the value out by using -bP anyway. */
 #endif
 
 
-uschar *acl_var[ACL_C_MAX+ACL_M_MAX];
+uschar *acl_var[ACL_CVARS + ACL_MVARS];
 
 uschar *active_hostname        = NULL;
 BOOL    allow_unqualified_recipient = FALSE;
index fb84c336e4fe84b172fb9e85fb77f0392dce27b7..286d61568ab1c4a847848121916ba2ab8aa20444 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/acl.c,v 1.52 2005/12/06 10:25:59 ph10 Exp $ */
+/* $Cambridge: exim/src/src/acl.c,v 1.53 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -752,17 +752,33 @@ while ((s = (*func)()) != NULL)
 
   if (c == ACLC_SET)
     {
-    if (Ustrncmp(s, "acl_", 4) != 0 || (s[4] != 'c' && s[4] != 'm') ||
-        !isdigit(s[5]) || (!isspace(s[6]) && s[6] != '='))
+    int offset, max, n;
+    uschar *endptr;
+
+    if (Ustrncmp(s, "acl_", 4) != 0) goto BAD_ACL_VAR;
+    if (s[4] == 'c')
+      {
+      offset = 0;
+      max = ACL_CVARS;
+      }
+    else if (s[4] == 'm')
+      {
+      offset = ACL_CVARS;
+      max = ACL_MVARS;
+      }
+    else goto BAD_ACL_VAR;
+
+    n = Ustrtoul(s + 5, &endptr, 10);
+    if ((*endptr != 0 && *endptr != '=' && !isspace(*endptr)) || n >= max)
       {
-      *error = string_sprintf("unrecognized name after \"set\" in ACL "
-        "modifier \"set %s\"", s);
+      BAD_ACL_VAR:
+      *error = string_sprintf("syntax error or unrecognized name after "
+        "\"set\" in ACL modifier \"set %s\"", s);
       return NULL;
       }
 
-    cond->u.varnumber = s[5] - '0';
-    if (s[4] == 'm') cond->u.varnumber += ACL_C_MAX;
-    s += 6;
+    cond->u.varnumber = n + offset;
+    s = endptr;
     while (isspace(*s)) s++;
     }
 
@@ -2329,8 +2345,8 @@ for (; cb != NULL; cb = cb->next)
     if (cb->type == ACLC_SET)
       {
       int n = cb->u.varnumber;
-      int t = (n < ACL_C_MAX)? 'c' : 'm';
-      if (n >= ACL_C_MAX) n -= ACL_C_MAX;
+      int t = (n < ACL_CVARS)? 'c' : 'm';
+      if (n >= ACL_CVARS) n -= ACL_CVARS;
       debug_printf("acl_%c%d ", t, n);
       lhswidth += 7;
       }
@@ -2802,7 +2818,7 @@ for (; cb != NULL; cb = cb->next)
     case ACLC_SET:
       {
       int old_pool = store_pool;
-      if (cb->u.varnumber < ACL_C_MAX) store_pool = POOL_PERM;
+      if (cb->u.varnumber < ACL_CVARS) store_pool = POOL_PERM;
       acl_var[cb->u.varnumber] = string_copy(arg);
       store_pool = old_pool;
       }
index 4991d6591c6565d7e33134331ae815212494171a..914d8c6a25ba89f03506b21f0e8cf5c99fc04245 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/config.h.defaults,v 1.7 2005/08/01 13:20:28 ph10 Exp $ */
+/* $Cambridge: exim/src/src/config.h.defaults,v 1.8 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -11,6 +11,9 @@
 any data just defines the existence of the variable; it won't get included
 in config.h unless some value is defined in Local/Makefile. */
 
+#define ACL_CVARS                    20
+#define ACL_MVARS                    20
+
 #define ALT_CONFIG_PREFIX
 #define ALT_CONFIG_ROOT_ONLY
 
index 8523ace2109abd1b4602bee1b02ec9b1e730c741..048b87a096104c5106a701a300fd09100139b902 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.50 2005/12/12 12:05:08 ph10 Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.51 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -298,26 +298,6 @@ enum {
 /* This table must be kept in alphabetical order. */
 
 static var_entry var_table[] = {
-  { "acl_c0",              vtype_stringptr,   &acl_var[0] },
-  { "acl_c1",              vtype_stringptr,   &acl_var[1] },
-  { "acl_c2",              vtype_stringptr,   &acl_var[2] },
-  { "acl_c3",              vtype_stringptr,   &acl_var[3] },
-  { "acl_c4",              vtype_stringptr,   &acl_var[4] },
-  { "acl_c5",              vtype_stringptr,   &acl_var[5] },
-  { "acl_c6",              vtype_stringptr,   &acl_var[6] },
-  { "acl_c7",              vtype_stringptr,   &acl_var[7] },
-  { "acl_c8",              vtype_stringptr,   &acl_var[8] },
-  { "acl_c9",              vtype_stringptr,   &acl_var[9] },
-  { "acl_m0",              vtype_stringptr,   &acl_var[10] },
-  { "acl_m1",              vtype_stringptr,   &acl_var[11] },
-  { "acl_m2",              vtype_stringptr,   &acl_var[12] },
-  { "acl_m3",              vtype_stringptr,   &acl_var[13] },
-  { "acl_m4",              vtype_stringptr,   &acl_var[14] },
-  { "acl_m5",              vtype_stringptr,   &acl_var[15] },
-  { "acl_m6",              vtype_stringptr,   &acl_var[16] },
-  { "acl_m7",              vtype_stringptr,   &acl_var[17] },
-  { "acl_m8",              vtype_stringptr,   &acl_var[18] },
-  { "acl_m9",              vtype_stringptr,   &acl_var[19] },
   { "acl_verify_message",  vtype_stringptr,   &acl_verify_message },
   { "address_data",        vtype_stringptr,   &deliver_address_data },
   { "address_file",        vtype_stringptr,   &address_file },
@@ -1249,6 +1229,33 @@ find_variable(uschar *name, BOOL exists_only, BOOL skipping, int *newsize)
 int first = 0;
 int last = var_table_size;
 
+/* Handle ACL variables, which are not in the table because their number may
+vary depending on a build-time setting. */
+
+if (Ustrncmp(name, "acl_", 4) == 0)
+  {
+  int offset, max, n;
+  uschar *endptr;
+
+  if (name[4] == 'm')
+    {
+    offset = ACL_CVARS;
+    max = ACL_MVARS;
+    }
+  else if (name[4] == 'c')
+    {
+    offset = 0;
+    max = ACL_CVARS;
+    }
+  else return NULL;
+
+  n = Ustrtoul(name + 5, &endptr, 10);
+  if (*endptr != 0 || n >= max) return NULL;
+  return (acl_var[offset + n] == NULL)? US"" : acl_var[offset + n];
+  }
+
+/* For all other variables, search the table */
+
 while (last > first)
   {
   uschar *s, *domain;
@@ -1260,7 +1267,7 @@ while (last > first)
   if (c < 0) { last = middle; continue; }
 
   /* Found an existing variable. If in skipping state, the value isn't needed,
-  and we want to avoid processing (such as looking up up the host name). */
+  and we want to avoid processing (such as looking up the host name). */
 
   if (skipping) return US"";
 
index 941d85a5aa3b29663e267050fa808646c7335d36..787a88fdb20d237f6d038e9fb2398d87ddb67ab2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.43 2005/12/06 10:25:59 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.44 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -184,7 +184,7 @@ uschar *acl_smtp_rcpt          = NULL;
 uschar *acl_smtp_starttls      = NULL;
 uschar *acl_smtp_vrfy          = NULL;
 BOOL    acl_temp_details       = FALSE;
-uschar *acl_var[ACL_C_MAX+ACL_M_MAX];
+uschar *acl_var[ACL_CVARS + ACL_MVARS];
 uschar *acl_verify_message     = NULL;
 header_line *acl_warn_headers  = NULL;
 string_item *acl_warn_logged   = NULL;
index c91cc67a2bce447ad50c3e06949a58eb9c7bb3d1..0a5463fc5d0532409eb647ebafb68e3d42aa2dad 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.h,v 1.31 2005/12/06 10:25:59 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.32 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -126,7 +126,7 @@ extern uschar *acl_smtp_rcpt;          /* ACL run for RCPT */
 extern uschar *acl_smtp_starttls;      /* ACL run for STARTTLS */
 extern uschar *acl_smtp_vrfy;          /* ACL run for VRFY */
 extern BOOL    acl_temp_details;       /* TRUE to give details for 4xx error */
-extern uschar *acl_var[ACL_C_MAX+ACL_M_MAX]; /* User variables */
+extern uschar *acl_var[ACL_CVARS+ACL_MVARS]; /* User ACL variables */
 extern uschar *acl_verify_message;     /* User message for verify failure */
 extern header_line *acl_warn_headers;  /* Warning headers added by ACL */
 extern string_item *acl_warn_logged;   /* Logged lines */
index 97aaf05c20f39c5b091028b4120e60343a066d6e..911a5ea74405e869a22e43b9fe84ebef7647a2e1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.20 2005/11/14 16:09:54 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.21 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -160,11 +160,6 @@ record. */
 
 #define WAIT_NAME_MAX 50
 
-/* The numbers of connection and message variables for ACLs */
-
-#define ACL_C_MAX 10
-#define ACL_M_MAX 10
-
 /* Fixed option values for all PCRE functions */
 
 #define PCRE_COPT 0   /* compile */
index 01f4a09ef57410e3e69bac7a335281364f42c82d..5c953375c72522fdf8fceb1cc4628e5e217d996f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/smtp_in.c,v 1.26 2005/09/13 11:13:27 ph10 Exp $ */
+/* $Cambridge: exim/src/src/smtp_in.c,v 1.27 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -841,7 +841,9 @@ sender_rate = sender_rate_limit = sender_rate_period = NULL;
 ratelimiters_mail = NULL;           /* Updated by ratelimit ACL condition */
                    /* Note that ratelimiters_conn persists across resets. */
 
-for (i = 0; i < ACL_M_MAX; i++) acl_var[ACL_C_MAX + i] = NULL;
+/* The message variables follow the connection variables. */
+
+for (i = 0; i < ACL_MVARS; i++) acl_var[ACL_CVARS + i] = NULL;
 
 /* The message body variables use malloc store. They may be set if this is
 not the first message in an SMTP session and the previous message caused them
@@ -1162,7 +1164,7 @@ tls_advertised = FALSE;
 
 /* Reset ACL connection variables */
 
-for (i = 0; i < ACL_C_MAX; i++) acl_var[i] = NULL;
+for (i = 0; i < ACL_CVARS; i++) acl_var[i] = NULL;
 
 /* Allow for trailing 0 in the command buffer. */
 
index 8e56677bd7e1a2d84e5691acac941b717935e8de..9867e6134adf9d8623739eef0aaad5bbe07db293 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/spool_in.c,v 1.13 2005/08/09 13:31:53 ph10 Exp $ */
+/* $Cambridge: exim/src/src/spool_in.c,v 1.14 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -236,7 +236,7 @@ uschar *p;
 one exception. DO NOT change the default value of dont_deliver, because it may
 be forced by an external setting. */
 
-for (n = 0; n < ACL_C_MAX + ACL_M_MAX; n++) acl_var[n] = NULL;
+for (n = 0; n < ACL_CVARS + ACL_MVARS; n++) acl_var[n] = NULL;
 
 authenticated_id = NULL;
 authenticated_sender = NULL;
@@ -376,22 +376,54 @@ for (;;)
   {
   if (Ufgets(big_buffer, big_buffer_size, f) == NULL) goto SPOOL_READ_ERROR;
   if (big_buffer[0] != '-') break;
-
   big_buffer[Ustrlen(big_buffer) - 1] = 0;
+
+  /* For backward compatibility, we recognize "-acl", which was used before the
+  number of ACL variables changed. Its variable number is 0-9 for connection
+  variables, and 10-19 for message variables. */
+
   if (Ustrncmp(big_buffer, "-acl ", 5) == 0)
     {
     int index, count;
     if (sscanf(CS big_buffer + 5, "%d %d", &index, &count) != 2)
       goto SPOOL_FORMAT_ERROR;
-    /* Ignore if index too big - might be if a later release with more
-    variables built this spool file. */
-    if (index < ACL_C_MAX + ACL_M_MAX)
+    acl_var[index] = store_get(count + 1);
+    if (fread(acl_var[index], 1, count+1, f) < count) goto SPOOL_READ_ERROR;
+    acl_var[index][count] = 0;
+    }
+
+  /* Nowadays we use "-aclc" and "-aclm" for the different types of ACL
+  variable, because Exim may be built with different numbers of them. */
+
+  else if (Ustrncmp(big_buffer, "-aclc ", 6) == 0)
+    {
+    int index, count;
+    if (sscanf(CS big_buffer + 6, "%d %d", &index, &count) != 2)
+      goto SPOOL_FORMAT_ERROR;
+    if (index < ACL_CVARS)
       {
       acl_var[index] = store_get(count + 1);
       if (fread(acl_var[index], 1, count+1, f) < count) goto SPOOL_READ_ERROR;
       acl_var[index][count] = 0;
       }
     }
+
+  else if (Ustrncmp(big_buffer, "-aclm ", 6) == 0)
+    {
+    int index, count;
+    if (sscanf(CS big_buffer + 6, "%d %d", &index, &count) != 2)
+      goto SPOOL_FORMAT_ERROR;
+    if (index < ACL_MVARS)
+      {
+      index += ACL_CVARS;
+      acl_var[index] = store_get(count + 1);
+      if (fread(acl_var[index], 1, count+1, f) < count) goto SPOOL_READ_ERROR;
+      acl_var[index][count] = 0;
+      }
+    }
+
+  /* Other values */
+
   else if (Ustrcmp(big_buffer, "-local") == 0) sender_local = TRUE;
   else if (Ustrcmp(big_buffer, "-localerror") == 0)
     local_error_message = TRUE;
index d5f970224e6874a54d7282c75252418543826bae..04ecd908e370902941c8e69adc3743f06ffbb674 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/spool_out.c,v 1.8 2005/06/27 14:29:44 ph10 Exp $ */
+/* $Cambridge: exim/src/src/spool_out.c,v 1.9 2005/12/12 15:58:53 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -193,10 +193,17 @@ if (received_protocol != NULL)
 /* Preserve any ACL variables that are set. Because the values may contain
 newlines, we use an explicit length. */
 
-for (i = 0; i < ACL_C_MAX + ACL_M_MAX; i++)
+for (i = 0; i < ACL_CVARS; i++)
   {
   if (acl_var[i] != NULL)
-    fprintf(f, "-acl %d %d\n%s\n", i, Ustrlen(acl_var[i]), acl_var[i]);
+    fprintf(f, "-aclc %d %d\n%s\n", i, Ustrlen(acl_var[i]), acl_var[i]);
+  }
+
+for (i = 0; i < ACL_MVARS; i++)
+  {
+  int j = i + ACL_CVARS;
+  if (acl_var[j] != NULL)
+    fprintf(f, "-aclm %d %d\n%s\n", i, Ustrlen(acl_var[j]), acl_var[j]);
   }
 
 /* Now any other data that needs to be remembered. */