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
SPDX: license tags (mostly by guesswork)
[exim.git]
/
src
/
src
/
transports
/
lmtp.c
diff --git
a/src/src/transports/lmtp.c
b/src/src/transports/lmtp.c
index f007f4a97a7065f0ee3fe5eadc030350e03d091c..c734c3a26e3e38ab4a433ebaac798c6daf69a1b8 100644
(file)
--- a/
src/src/transports/lmtp.c
+++ b/
src/src/transports/lmtp.c
@@
-2,8
+2,10
@@
* Exim - an Internet mail transport agent *
*************************************************/
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2022 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-only */
#include "../exim.h"
#include "../exim.h"
@@
-21,17
+23,17
@@
instance block so as to be publicly visible; these are flagged with opt_public.
optionlist lmtp_transport_options[] = {
{ "batch_id", opt_stringptr | opt_public,
optionlist lmtp_transport_options[] = {
{ "batch_id", opt_stringptr | opt_public,
-
(void *)offsetof
(transport_instance, batch_id) },
+
OPT_OFF
(transport_instance, batch_id) },
{ "batch_max", opt_int | opt_public,
{ "batch_max", opt_int | opt_public,
-
(void *)offsetof
(transport_instance, batch_max) },
+
OPT_OFF
(transport_instance, batch_max) },
{ "command", opt_stringptr,
{ "command", opt_stringptr,
-
(void *)offsetof
(lmtp_transport_options_block, cmd) },
+
OPT_OFF
(lmtp_transport_options_block, cmd) },
{ "ignore_quota", opt_bool,
{ "ignore_quota", opt_bool,
-
(void *)offsetof
(lmtp_transport_options_block, ignore_quota) },
+
OPT_OFF
(lmtp_transport_options_block, ignore_quota) },
{ "socket", opt_stringptr,
{ "socket", opt_stringptr,
-
(void *)offsetof
(lmtp_transport_options_block, skt) },
+
OPT_OFF
(lmtp_transport_options_block, skt) },
{ "timeout", opt_time,
{ "timeout", opt_time,
-
(void *)offsetof
(lmtp_transport_options_block, timeout) }
+
OPT_OFF
(lmtp_transport_options_block, timeout) }
};
/* Size of the options list. An extern variable has to be used so that its
};
/* Size of the options list. An extern variable has to be used so that its
@@
-122,7
+124,8
@@
Arguments:
Returns: TRUE if a "QUIT" command should be sent, else FALSE
*/
Returns: TRUE if a "QUIT" command should be sent, else FALSE
*/
-static BOOL check_response(int *errno_value, int more_errno, uschar *buffer,
+static BOOL
+check_response(int *errno_value, int more_errno, uschar *buffer,
int *yield, uschar **message)
{
*yield = '4'; /* Default setting is to give a temporary error */
int *yield, uschar **message)
{
*yield = '4'; /* Default setting is to give a temporary error */
@@
-174,7
+177,7
@@
if (*errno_value == ERRNO_CHHEADER_FAIL)
if (*errno_value == ERRNO_WRITEINCOMPLETE)
{
if (*errno_value == ERRNO_WRITEINCOMPLETE)
{
- *message =
string_sprintf("failed to write a data block")
;
+ *message =
US"failed to write a data block"
;
return FALSE;
}
return FALSE;
}
@@
-227,8
+230,11
@@
gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer };
int rc;
va_list ap;
int rc;
va_list ap;
+/*XXX see comment in smtp_write_command() regarding leaving stuff in
+big_buffer */
+
va_start(ap, format);
va_start(ap, format);
-if (!string_vformat(&gs,
FALSE
, CS format, ap))
+if (!string_vformat(&gs,
SVFMT_TAINT_NOCHK
, CS format, ap))
{
va_end(ap);
errno = ERRNO_SMTPFORMAT;
{
va_end(ap);
errno = ERRNO_SMTPFORMAT;
@@
-484,8
+490,8
@@
if (ob->cmd)
{
DEBUG(D_transport) debug_printf("using command %s\n", ob->cmd);
sprintf(CS buffer, "%.50s transport", tblock->name);
{
DEBUG(D_transport) debug_printf("using command %s\n", ob->cmd);
sprintf(CS buffer, "%.50s transport", tblock->name);
- if (!transport_set_up_command(&argv, ob->cmd, TRUE, PANIC, addrlist,
buffer
,
- NULL))
+ if (!transport_set_up_command(&argv, ob->cmd, TRUE, PANIC, addrlist,
FALSE
,
+
buffer,
NULL))
return FALSE;
/* If the -N option is set, can't do any more. Presume all has gone well. */
return FALSE;
/* If the -N option is set, can't do any more. Presume all has gone well. */
@@
-496,7
+502,8
@@
if (ob->cmd)
uid/gid and current directory. Request that the new process be a process group
leader, so we can kill it and all its children on an error. */
uid/gid and current directory. Request that the new process be a process group
leader, so we can kill it and all its children on an error. */
- if ((pid = child_open(USS argv, NULL, 0, &fd_in, &fd_out, TRUE)) < 0)
+ if ((pid = child_open(USS argv, NULL, 0, &fd_in, &fd_out, TRUE,
+ US"lmtp-tpt-cmd")) < 0)
{
addrlist->message = string_sprintf(
"Failed to create child process for %s transport: %s", tblock->name,
{
addrlist->message = string_sprintf(
"Failed to create child process for %s transport: %s", tblock->name,
@@
-510,8
+517,7
@@
leader, so we can kill it and all its children on an error. */
else
{
DEBUG(D_transport) debug_printf("using socket %s\n", ob->skt);
else
{
DEBUG(D_transport) debug_printf("using socket %s\n", ob->skt);
- sockname = expand_string(ob->skt);
- if (sockname == NULL)
+ if (!(sockname = expand_string(ob->skt)))
{
addrlist->message = string_sprintf("Expansion of \"%s\" (socket setting "
"for %s transport) failed: %s", ob->skt, tblock->name,
{
addrlist->message = string_sprintf("Expansion of \"%s\" (socket setting "
"for %s transport) failed: %s", ob->skt, tblock->name,
@@
-552,24
+558,24
@@
allows for message+recipient checks after the message has been received. */
/* First thing is to wait for an initial greeting. */
/* First thing is to wait for an initial greeting. */
-Ustrcpy(big_buffer, "initial connection");
-if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
-
timeout))
goto RESPONSE_FAILED;
+Ustrcpy(big_buffer,
US
"initial connection");
+if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
timeout))
+ goto RESPONSE_FAILED;
/* Next, we send a LHLO command, and expect a positive response */
/* Next, we send a LHLO command, and expect a positive response */
-if (!lmtp_write_command(fd_in, "%s %s\r\n", "LHLO",
-
primary_hostname))
goto WRITE_FAILED;
+if (!lmtp_write_command(fd_in, "%s %s\r\n", "LHLO",
primary_hostname))
+ goto WRITE_FAILED;
-if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
-
timeout))
goto RESPONSE_FAILED;
+if (!lmtp_read_response(out, buffer, sizeof(buffer), '2',
timeout))
+ goto RESPONSE_FAILED;
/* If the ignore_quota option is set, note whether the server supports the
IGNOREQUOTA option, and if so, set an appropriate addition for RCPT. */
if (ob->ignore_quota)
/* If the ignore_quota option is set, note whether the server supports the
IGNOREQUOTA option, and if so, set an appropriate addition for RCPT. */
if (ob->ignore_quota)
- igquotstr =
(pcre_exec(regex_IGNOREQUOTA, NULL, CS buffer,
-
Ustrlen(CS buffer), 0, PCRE_EOPT, NULL, 0) >= 0)
? US" IGNOREQUOTA" : US"";
+ igquotstr =
regex_match(regex_IGNOREQUOTA, buffer, -1, NULL)
+ ? US" IGNOREQUOTA" : US"";
/* Now the envelope sender */
/* Now the envelope sender */
@@
-640,7
+646,7
@@
if (send_data)
sigalrm_seen = FALSE;
transport_write_timeout = timeout;
sigalrm_seen = FALSE;
transport_write_timeout = timeout;
- Ustrcpy(big_buffer, "sending data block"); /* For error messages */
+ Ustrcpy(big_buffer,
US
"sending data block"); /* For error messages */
DEBUG(D_transport|D_v)
debug_printf(" LMTP>> writing message and terminating \".\"\n");
DEBUG(D_transport|D_v)
debug_printf(" LMTP>> writing message and terminating \".\"\n");
@@
-656,7
+662,7
@@
if (send_data)
goto RESPONSE_FAILED;
}
goto RESPONSE_FAILED;
}
- Ustrcpy(big_buffer, "end of data"); /* For error messages */
+ Ustrcpy(big_buffer,
US
"end of data"); /* For error messages */
/* We now expect a response for every address that was accepted above,
in the same order. For those that get a response, their status is fixed;
/* We now expect a response for every address that was accepted above,
in the same order. For those that get a response, their status is fixed;
@@
-762,9
+768,9
@@
if (errno == ERRNO_CHHEADER_FAIL)
string_sprintf("Failed to expand headers_add or headers_remove: %s",
expand_string_message);
else if (errno == ERRNO_FILTER_FAIL)
string_sprintf("Failed to expand headers_add or headers_remove: %s",
expand_string_message);
else if (errno == ERRNO_FILTER_FAIL)
- addrlist->message =
string_sprintf("Filter process failure")
;
+ addrlist->message =
US"Filter process failure"
;
else if (errno == ERRNO_WRITEINCOMPLETE)
else if (errno == ERRNO_WRITEINCOMPLETE)
- addrlist->message =
string_sprintf("Failed repeatedly to write data")
;
+ addrlist->message =
US"Failed repeatedly to write data"
;
else if (errno == ERRNO_SMTPFORMAT)
addrlist->message = US"overlong LMTP command generated";
else
else if (errno == ERRNO_SMTPFORMAT)
addrlist->message = US"overlong LMTP command generated";
else