git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Expand recipients_max
[exim.git]
/
src
/
src
/
exim.c
diff --git
a/src/src/exim.c
b/src/src/exim.c
index c53b98186ba95a297317a4bad85739cc214f8b02..10fc989632f124896212fa7966934091f4031efd 100644
(file)
--- a/
src/src/exim.c
+++ b/
src/src/exim.c
@@
-49,6
+49,8
@@
optimize out the tail recursion and so not make them too expensive. */
static void *
function_store_malloc(PCRE2_SIZE size, void * tag)
{
static void *
function_store_malloc(PCRE2_SIZE size, void * tag)
{
+if (size > INT_MAX)
+ log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
return store_malloc((int)size);
}
return store_malloc((int)size);
}
@@
-63,12
+65,15
@@
if (block) store_free(block);
static void *
function_store_get(PCRE2_SIZE size, void * tag)
{
static void *
function_store_get(PCRE2_SIZE size, void * tag)
{
+if (size > INT_MAX)
+ log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
return store_get((int)size, GET_UNTAINTED); /* loses track of taint */
}
static void
function_store_nullfree(void * block, void * tag)
{
return store_get((int)size, GET_UNTAINTED); /* loses track of taint */
}
static void
function_store_nullfree(void * block, void * tag)
{
+/* We cannot free memory allocated using store_get() */
}
}
@@
-1100,6
+1105,9
@@
g = string_cat(g, US"Support for:");
#ifndef DISABLE_DNSSEC
g = string_cat(g, US" DNSSEC");
#endif
#ifndef DISABLE_DNSSEC
g = string_cat(g, US" DNSSEC");
#endif
+#ifndef DISABLE_ESMTP_LIMITS
+ g = string_cat(g, US" ESMTP_Limits");
+#endif
#ifndef DISABLE_EVENT
g = string_cat(g, US" Event");
#endif
#ifndef DISABLE_EVENT
g = string_cat(g, US" Event");
#endif
@@
-1146,9
+1154,6
@@
g = string_cat(g, US"Support for:");
#ifdef EXPERIMENTAL_DSN_INFO
g = string_cat(g, US" Experimental_DSN_info");
#endif
#ifdef EXPERIMENTAL_DSN_INFO
g = string_cat(g, US" Experimental_DSN_info");
#endif
-#ifdef EXPERIMENTAL_ESMTP_LIMITS
- g = string_cat(g, US" Experimental_ESMTP_Limits");
-#endif
#ifdef EXPERIMENTAL_QUEUEFILE
g = string_cat(g, US" Experimental_QUEUEFILE");
#endif
#ifdef EXPERIMENTAL_QUEUEFILE
g = string_cat(g, US" Experimental_QUEUEFILE");
#endif
@@
-3014,7
+3019,7
@@
on the second character (the one after '-'), to save some effort. */
case 'K': smtp_peer_options |= OPTION_CHUNKING; break;
case 'K': smtp_peer_options |= OPTION_CHUNKING; break;
-#if
def EXPERIMENTAL
_ESMTP_LIMITS
+#if
ndef DISABLE
_ESMTP_LIMITS
/* -MCL: peer used LIMITS RCPTMAX and/or RCPTDOMAINMAX */
case 'L': if (++i < argc) continue_limit_mail = Uatoi(argv[i]);
else badarg = TRUE;
/* -MCL: peer used LIMITS RCPTMAX and/or RCPTDOMAINMAX */
case 'L': if (++i < argc) continue_limit_mail = Uatoi(argv[i]);
else badarg = TRUE;
@@
-5334,6
+5339,7
@@
if (expansion_test)
else if (expansion_test_message)
{
else if (expansion_test_message)
{
+ uschar * rme = expand_string(recipients_max);
int save_stdin = dup(0);
int fd = Uopen(expansion_test_message, O_RDONLY, 0);
if (fd < 0)
int save_stdin = dup(0);
int fd = Uopen(expansion_test_message, O_RDONLY, 0);
if (fd < 0)
@@
-5342,6
+5348,7
@@
if (expansion_test)
(void) dup2(fd, 0);
filter_test = FTEST_USER; /* Fudge to make it look like filter test */
message_ended = END_NOTENDED;
(void) dup2(fd, 0);
filter_test = FTEST_USER; /* Fudge to make it look like filter test */
message_ended = END_NOTENDED;
+ recipients_max_expanded = atoi(CCS rme);
read_message_body(receive_msg(extract_recipients));
message_linecount += body_linecount;
(void)dup2(save_stdin, 0);
read_message_body(receive_msg(extract_recipients));
message_linecount += body_linecount;
(void)dup2(save_stdin, 0);
@@
-5748,8
+5755,8
@@
for (BOOL more = TRUE; more; )
int rc;
if ((rc = smtp_setup_msg()) > 0)
{
int rc;
if ((rc = smtp_setup_msg()) > 0)
{
- if (
real_sender_address != NULL &&
- !receive_check_set_sender(sender_address))
+ if (
real_sender_address
+
&&
!receive_check_set_sender(sender_address))
{
sender_address = raw_sender = real_sender_address;
sender_address_unrewritten = NULL;
{
sender_address = raw_sender = real_sender_address;
sender_address_unrewritten = NULL;
@@
-5796,10
+5803,12
@@
for (BOOL more = TRUE; more; )
else
{
else
{
-
int rcount = 0
;
- int count = argc - recipients_arg;
+
uschar * rme = expand_string(recipients_max)
;
+ int
rcount = 0,
count = argc - recipients_arg;
const uschar ** list = argv + recipients_arg;
const uschar ** list = argv + recipients_arg;
+ recipients_max_expanded = atoi(CCS rme);
+
/* These options cannot be changed dynamically for non-SMTP messages */
f.active_local_sender_retain = local_sender_retain;
/* These options cannot be changed dynamically for non-SMTP messages */
f.active_local_sender_retain = local_sender_retain;
@@
-5826,15
+5835,19
@@
for (BOOL more = TRUE; more; )
while (*s)
{
BOOL finished = FALSE;
while (*s)
{
BOOL finished = FALSE;
- uschar *recipient;
- uschar *ss = parse_find_address_end(s, FALSE);
+ uschar *
recipient;
+ uschar *
ss = parse_find_address_end(s, FALSE);
if (*ss == ',') *ss = 0; else finished = TRUE;
/* Check max recipients - if -t was used, these aren't recipients */
if (*ss == ',') *ss = 0; else finished = TRUE;
/* Check max recipients - if -t was used, these aren't recipients */
- if (recipients_max > 0 && ++rcount > recipients_max &&
- !extract_recipients)
+ if ( recipients_max_expanded > 0 && ++rcount > recipients_max_expanded
+ && !extract_recipients)
+ {
+ DEBUG(D_all) debug_printf("excess reipients (max %d)\n",
+ recipients_max_expanded);
+
if (error_handling == ERRORS_STDERR)
{
fprintf(stderr, "exim: too many recipients\n");
if (error_handling == ERRORS_STDERR)
{
fprintf(stderr, "exim: too many recipients\n");
@@
-5844,6
+5857,7
@@
for (BOOL more = TRUE; more; )
return
moan_to_sender(ERRMESS_TOOMANYRECIP, NULL, NULL, stdin, TRUE)?
errors_sender_rc : EXIT_FAILURE;
return
moan_to_sender(ERRMESS_TOOMANYRECIP, NULL, NULL, stdin, TRUE)?
errors_sender_rc : EXIT_FAILURE;
+ }
#ifdef SUPPORT_I18N
{
#ifdef SUPPORT_I18N
{
@@
-5868,6
+5882,10
@@
for (BOOL more = TRUE; more; )
}
if (!recipient)
}
if (!recipient)
+ {
+ DEBUG(D_all) debug_printf("bad recipient address \"%s\": %s\n",
+ string_printing(list[i]), errmess);
+
if (error_handling == ERRORS_STDERR)
{
fprintf(stderr, "exim: bad recipient address \"%s\": %s\n",
if (error_handling == ERRORS_STDERR)
{
fprintf(stderr, "exim: bad recipient address \"%s\": %s\n",
@@
-5884,6
+5902,7
@@
for (BOOL more = TRUE; more; )
moan_to_sender(ERRMESS_BADARGADDRESS, &eblock, NULL, stdin, TRUE)?
errors_sender_rc : EXIT_FAILURE;
}
moan_to_sender(ERRMESS_BADARGADDRESS, &eblock, NULL, stdin, TRUE)?
errors_sender_rc : EXIT_FAILURE;
}
+ }
receive_add_recipient(string_copy_taint(recipient, GET_TAINTED), -1);
s = ss;
receive_add_recipient(string_copy_taint(recipient, GET_TAINTED), -1);
s = ss;