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
Debug: "kill" option on ACL control=debug. Bug 1831
[exim.git]
/
src
/
src
/
spool_in.c
diff --git
a/src/src/spool_in.c
b/src/src/spool_in.c
index 742f4b579e582c3bb30bce24ff8e41b56efb86a0..cafca603d54f09c5f169c3ea8fcdeb1f773cf14f 100644
(file)
--- a/
src/src/spool_in.c
+++ b/
src/src/spool_in.c
@@
-2,7
+2,7
@@
* Exim - an Internet mail transport agent *
*************************************************/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 201
2
*/
+/* Copyright (c) University of Cambridge 1995 - 201
6
*/
/* See the file NOTICE for conditions of use and distribution. */
/* Functions for reading spool files. When compiling for a utility (eximon),
/* See the file NOTICE for conditions of use and distribution. */
/* Functions for reading spool files. When compiling for a utility (eximon),
@@
-26,18
+26,19
@@
overwriting some other file descriptor with the value of this one), open it
with append.
Argument: the id of the message
with append.
Argument: the id of the message
-Returns:
TRUE if file successfully opened and locked
+Returns:
fd if file successfully opened and locked, else -1
-Side effect:
deliver_datafile is set to the fd of the open file.
+Side effect:
message_subdir is set for the (possibly split) spool directory
*/
*/
-BOOL
+int
spool_open_datafile(uschar *id)
{
int i;
struct stat statbuf;
flock_t lock_data;
uschar spoolname[256];
spool_open_datafile(uschar *id)
{
int i;
struct stat statbuf;
flock_t lock_data;
uschar spoolname[256];
+int fd;
/* If split_spool_directory is set, first look for the file in the appropriate
sub-directory of the input directory. If it is not found there, try the input
/* If split_spool_directory is set, first look for the file in the appropriate
sub-directory of the input directory. If it is not found there, try the input
@@
-51,8
+52,8
@@
for (i = 0; i < 2; i++)
int save_errno;
message_subdir[0] = (split_spool_directory == (i == 0))? id[5] : 0;
sprintf(CS spoolname, "%s/input/%s/%s-D", spool_directory, message_subdir, id);
int save_errno;
message_subdir[0] = (split_spool_directory == (i == 0))? id[5] : 0;
sprintf(CS spoolname, "%s/input/%s/%s-D", spool_directory, message_subdir, id);
- deliver_datafile = Uopen(spoolname, O_RDWR | O_APPEND, 0);
-
if (deliver_datafile >= 0)
break;
+ if ((fd = Uopen(spoolname, O_RDWR | O_APPEND, 0)) >= 0)
+
break;
save_errno = errno;
if (errno == ENOENT)
{
save_errno = errno;
if (errno == ENOENT)
{
@@
-63,7
+64,7
@@
for (i = 0; i < 2; i++)
else log_write(0, LOG_MAIN, "Spool error for %s: %s", spoolname,
strerror(errno));
errno = save_errno;
else log_write(0, LOG_MAIN, "Spool error for %s: %s", spoolname,
strerror(errno));
errno = save_errno;
- return
FALSE
;
+ return
-1
;
}
/* File is open and message_subdir is set. Set the close-on-exec flag, and lock
}
/* File is open and message_subdir is set. Set the close-on-exec flag, and lock
@@
-74,7
+75,7
@@
an open file descriptor (at least, I think that's the Cygwin story). On real
Unix systems it doesn't make any difference as long as Exim is consistent in
what it locks. */
Unix systems it doesn't make any difference as long as Exim is consistent in
what it locks. */
-(void)fcntl(
deliver_datafile, F_SETFD, fcntl(deliver_datafile
, F_GETFD) |
+(void)fcntl(
fd, F_SETFD, fcntl(fd
, F_GETFD) |
FD_CLOEXEC);
lock_data.l_type = F_WRLCK;
FD_CLOEXEC);
lock_data.l_type = F_WRLCK;
@@
-82,27
+83,26
@@
lock_data.l_whence = SEEK_SET;
lock_data.l_start = 0;
lock_data.l_len = SPOOL_DATA_START_OFFSET;
lock_data.l_start = 0;
lock_data.l_len = SPOOL_DATA_START_OFFSET;
-if (fcntl(
deliver_datafile
, F_SETLK, &lock_data) < 0)
+if (fcntl(
fd
, F_SETLK, &lock_data) < 0)
{
log_write(L_skip_delivery,
LOG_MAIN,
"Spool file is locked (another process is handling this message)");
{
log_write(L_skip_delivery,
LOG_MAIN,
"Spool file is locked (another process is handling this message)");
- (void)close(deliver_datafile);
- deliver_datafile = -1;
+ (void)close(fd);
errno = 0;
errno = 0;
- return
FALSE
;
+ return
-1
;
}
/* Get the size of the data; don't include the leading filename line
in the count, but add one for the newline before the data. */
}
/* Get the size of the data; don't include the leading filename line
in the count, but add one for the newline before the data. */
-if (fstat(
deliver_datafile
, &statbuf) == 0)
+if (fstat(
fd
, &statbuf) == 0)
{
message_body_size = statbuf.st_size - SPOOL_DATA_START_OFFSET;
message_size = message_body_size + 1;
}
{
message_body_size = statbuf.st_size - SPOOL_DATA_START_OFFSET;
message_size = message_body_size + 1;
}
-return
TRUE
;
+return
fd
;
}
#endif /* COMPILE_UTILITY */
}
#endif /* COMPILE_UTILITY */
@@
-288,19
+288,24
@@
tls_in.certificate_verified = FALSE;
tls_in.dane_verified = FALSE;
# endif
tls_in.cipher = NULL;
tls_in.dane_verified = FALSE;
# endif
tls_in.cipher = NULL;
-tls_in.ourcert = NULL;
-tls_in.peercert = NULL;
+# ifndef COMPILE_UTILITY /* tls support fns not built in */
+tls_free_cert(&tls_in.ourcert);
+tls_free_cert(&tls_in.peercert);
+# endif
tls_in.peerdn = NULL;
tls_in.sni = NULL;
tls_in.ocsp = OCSP_NOT_REQ;
#endif
#ifdef WITH_CONTENT_SCAN
tls_in.peerdn = NULL;
tls_in.sni = NULL;
tls_in.ocsp = OCSP_NOT_REQ;
#endif
#ifdef WITH_CONTENT_SCAN
+spam_bar = NULL;
+spam_score = NULL;
spam_score_int = NULL;
#endif
spam_score_int = NULL;
#endif
-#if defined(
EXPERIMENTAL_INTERNATIONAL
) && !defined(COMPILE_UTILITY)
+#if defined(
SUPPORT_I18N
) && !defined(COMPILE_UTILITY)
message_smtputf8 = FALSE;
message_smtputf8 = FALSE;
+message_utf8_downconvert = 0;
#endif
dsn_ret = 0;
#endif
dsn_ret = 0;
@@
-468,11
+473,13
@@
for (;;)
int index, count;
uschar name[20]; /* Need plenty of space for %d format */
tree_node *node;
int index, count;
uschar name[20]; /* Need plenty of space for %d format */
tree_node *node;
- if (sscanf(CS big_buffer + 5, "%d %d", &index, &count) != 2)
+ if ( sscanf(CS big_buffer + 5, "%d %d", &index, &count) != 2
+ || index >= 20
+ )
goto SPOOL_FORMAT_ERROR;
if (index < 10)
(void) string_format(name, sizeof(name), "%c%d", 'c', index);
goto SPOOL_FORMAT_ERROR;
if (index < 10)
(void) string_format(name, sizeof(name), "%c%d", 'c', index);
- else
if (index < 20) /* ignore out-of-range index */
+ else
(void) string_format(name, sizeof(name), "%c%d", 'm', index - 10);
node = acl_var_create(name);
node->data.ptr = store_get(count + 1);
(void) string_format(name, sizeof(name), "%c%d", 'm', index - 10);
node = acl_var_create(name);
node->data.ptr = store_get(count + 1);
@@
-506,7
+513,8
@@
for (;;)
if (Ustrncmp(p, "rozen", 5) == 0)
{
deliver_freeze = TRUE;
if (Ustrncmp(p, "rozen", 5) == 0)
{
deliver_freeze = TRUE;
- sscanf(CS big_buffer+7, TIME_T_FMT, &deliver_frozen_at);
+ if (sscanf(CS big_buffer+7, TIME_T_FMT, &deliver_frozen_at) != 1)
+ goto SPOOL_READ_ERROR;
}
break;
}
break;
@@
-570,10
+578,14
@@
for (;;)
if (Ustrncmp(p, "ender_set_untrusted", 19) == 0)
sender_set_untrusted = TRUE;
#ifdef WITH_CONTENT_SCAN
if (Ustrncmp(p, "ender_set_untrusted", 19) == 0)
sender_set_untrusted = TRUE;
#ifdef WITH_CONTENT_SCAN
+ else if (Ustrncmp(p, "pam_bar ", 8) == 0)
+ spam_bar = string_copy(big_buffer + 10);
+ else if (Ustrncmp(p, "pam_score ", 10) == 0)
+ spam_score = string_copy(big_buffer + 12);
else if (Ustrncmp(p, "pam_score_int ", 14) == 0)
spam_score_int = string_copy(big_buffer + 16);
#endif
else if (Ustrncmp(p, "pam_score_int ", 14) == 0)
spam_score_int = string_copy(big_buffer + 16);
#endif
-#if defined(
EXPERIMENTAL_INTERNATIONAL
) && !defined(COMPILE_UTILITY)
+#if defined(
SUPPORT_I18N
) && !defined(COMPILE_UTILITY)
else if (Ustrncmp(p, "mtputf8", 7) == 0)
message_smtputf8 = TRUE;
#endif
else if (Ustrncmp(p, "mtputf8", 7) == 0)
message_smtputf8 = TRUE;
#endif
@@
-600,6
+612,15
@@
for (;;)
break;
#endif
break;
#endif
+#if defined(SUPPORT_I18N) && !defined(COMPILE_UTILITY)
+ case 'u':
+ if (Ustrncmp(p, "tf8_downcvt", 11) == 0)
+ message_utf8_downconvert = 1;
+ else if (Ustrncmp(p, "tf8_optdowncvt", 15) == 0)
+ message_utf8_downconvert = -1;
+ break;
+#endif
+
default: /* Present because some compilers complain if all */
break; /* possibilities are not covered. */
}
default: /* Present because some compilers complain if all */
break; /* possibilities are not covered. */
}
@@
-743,7
+764,7
@@
for (recipients_count = 0; recipients_count < rcount; recipients_count++)
{
p -= len;
errors_to = string_copy(p);
{
p -= len;
errors_to = string_copy(p);
- }
+ }
}
*(--p) = 0; /* Terminate address */
}
*(--p) = 0; /* Terminate address */
@@
-757,7
+778,7
@@
for (recipients_count = 0; recipients_count < rcount; recipients_count++)
{
p -= len;
orcpt = string_copy(p);
{
p -= len;
orcpt = string_copy(p);
- }
+ }
}
*(--p) = 0; /* Terminate address */
}
*(--p) = 0; /* Terminate address */