summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTony Finch <dot@dot.at>2005-06-10 19:27:05 +0000
committerTony Finch <dot@dot.at>2005-06-10 19:27:05 +0000
commitfe0dab1189fa5050480bcc5f07df41c449aa92bf (patch)
tree9e701b4a73531776d84dd7500fcbfc1e325e3229 /src
parent28e6ef293e17995d56f1510cdf4f510b84034a83 (diff)
Another ratelimit tweak. I didn't anticipate people using per_cmd
ratelimits more than once in the same ACL (e.g. to increase the delay for higher rates) so the code didn't do the right thing in that situation. There's now a per_cmd cache which is reset at the start of each ACL run.
Diffstat (limited to 'src')
-rw-r--r--src/src/acl.c10
-rw-r--r--src/src/globals.c3
-rw-r--r--src/src/globals.h3
3 files changed, 10 insertions, 6 deletions
diff --git a/src/src/acl.c b/src/src/acl.c
index bfd66e3bb..980d3ab2d 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/acl.c,v 1.38 2005/06/10 18:59:34 fanf2 Exp $ */
+/* $Cambridge: exim/src/src/acl.c,v 1.39 2005/06/10 19:27:05 fanf2 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -2012,8 +2012,7 @@ if (!have_key && sender_host_address != NULL)
HDEBUG(D_acl) debug_printf("ratelimit condition limit=%.0f period=%.0f key=%s\n",
limit, period, key);
-/* If we are dealing with rate limits per connection, per message, or per byte,
-see if we have already computed the rate by looking in the relevant tree. For
+/* See if we have already computed the rate by looking in the relevant tree. For
per-connection rate limiting, store tree nodes and dbdata in the permanent pool
so that they survive across resets. */
@@ -2025,8 +2024,10 @@ if (per_conn)
anchor = &ratelimiters_conn;
store_pool = POOL_PERM;
}
-if (per_mail || per_byte)
+else if (per_mail || per_byte)
anchor = &ratelimiters_mail;
+else if (per_cmd)
+ anchor = &ratelimiters_cmd;
if (anchor != NULL && (t = tree_search(*anchor, key)) != NULL)
{
@@ -3326,6 +3327,7 @@ address_item *addr;
*user_msgptr = *log_msgptr = NULL;
sender_verified_failed = NULL;
+ratelimiters_cmd = NULL;
if (where == ACL_WHERE_RCPT)
{
diff --git a/src/src/globals.c b/src/src/globals.c
index 2f6b5fdda..43d5feeec 100644
--- a/src/src/globals.c
+++ b/src/src/globals.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.27 2005/05/24 08:15:02 tom Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.28 2005/06/10 19:27:05 fanf2 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -780,6 +780,7 @@ BOOL queue_smtp = FALSE;
uschar *queue_smtp_domains = NULL;
unsigned int random_seed = 0;
+tree_node *ratelimiters_cmd = NULL;
tree_node *ratelimiters_conn = NULL;
tree_node *ratelimiters_mail = NULL;
uschar *raw_active_hostname = NULL;
diff --git a/src/src/globals.h b/src/src/globals.h
index 63f9059b6..b4aa5b031 100644
--- a/src/src/globals.h
+++ b/src/src/globals.h
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.h,v 1.19 2005/05/24 08:15:02 tom Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.20 2005/06/10 19:27:05 fanf2 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -505,6 +505,7 @@ extern BOOL queue_smtp; /* Disable all immediate STMP (-odqs)*/
extern uschar *queue_smtp_domains; /* Ditto, for these domains */
extern unsigned int random_seed; /* Seed for random numbers */
+extern tree_node *ratelimiters_cmd; /* Results of command ratelimit checks */
extern tree_node *ratelimiters_conn; /* Results of connection ratelimit checks */
extern tree_node *ratelimiters_mail; /* Results of per-mail ratelimit checks */
extern uschar *raw_active_hostname; /* Pre-expansion */