summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgilles <gilles@openbsd.org>2018-12-27 15:41:50 +0000
committergilles <gilles@openbsd.org>2018-12-27 15:41:50 +0000
commitf67bab36b3484db1464096d80413c6aa5630823e (patch)
tree2871c86ec1d22eb9dbb23a2e3dc5b5ac3cc8d097
parenttable_fetch() always expect a valid dst pointer. (diff)
downloadwireguard-openbsd-f67bab36b3484db1464096d80413c6aa5630823e.tar.xz
wireguard-openbsd-f67bab36b3484db1464096d80413c6aa5630823e.zip
extract subaddress from last resolved node, not from dest or rcpt address
which was incorrect and can lead to ambiguous cases, this will affect the people who were using subaddresses within aliases themselves AND expected deliveries to a maildir subdir of the recipient user. ok eric@
-rw-r--r--usr.sbin/smtpd/envelope.c12
-rw-r--r--usr.sbin/smtpd/lka_session.c10
-rw-r--r--usr.sbin/smtpd/mda.c7
-rw-r--r--usr.sbin/smtpd/mda_unpriv.c8
-rw-r--r--usr.sbin/smtpd/smtpd-defines.h3
-rw-r--r--usr.sbin/smtpd/smtpd.h5
6 files changed, 33 insertions, 12 deletions
diff --git a/usr.sbin/smtpd/envelope.c b/usr.sbin/smtpd/envelope.c
index 7b80259dfb7..471fade2876 100644
--- a/usr.sbin/smtpd/envelope.c
+++ b/usr.sbin/smtpd/envelope.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: envelope.c,v 1.40 2018/12/08 08:01:15 sunil Exp $ */
+/* $OpenBSD: envelope.c,v 1.41 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2013 Eric Faurot <eric@openbsd.org>
@@ -199,6 +199,7 @@ envelope_dump_buffer(const struct envelope *ep, char *dest, size_t len)
switch (ep->type) {
case D_MDA:
envelope_ascii_dump(ep, &dest, &len, "mda-exec");
+ envelope_ascii_dump(ep, &dest, &len, "mda-subaddress");
envelope_ascii_dump(ep, &dest, &len, "mda-user");
break;
case D_MTA:
@@ -423,6 +424,9 @@ ascii_load_field(const char *field, struct envelope *ep, char *buf)
if (strcasecmp("mda-exec", field) == 0)
return ascii_load_string(ep->mda_exec, buf, sizeof(ep->mda_exec));
+ if (strcasecmp("mda-subaddress", field) == 0)
+ return ascii_load_string(ep->mda_subaddress, buf, sizeof(ep->mda_subaddress));
+
if (strcasecmp("mda-user", field) == 0)
return ascii_load_string(ep->mda_user, buf, sizeof(ep->mda_user));
@@ -667,6 +671,12 @@ ascii_dump_field(const char *field, const struct envelope *ep,
return 1;
}
+ if (strcasecmp(field, "mda-subaddress") == 0) {
+ if (ep->mda_subaddress[0])
+ return ascii_dump_string(ep->mda_subaddress, buf, len);
+ return 1;
+ }
+
if (strcasecmp(field, "mda-user") == 0) {
if (ep->mda_user[0])
return ascii_dump_string(ep->mda_user, buf, len);
diff --git a/usr.sbin/smtpd/lka_session.c b/usr.sbin/smtpd/lka_session.c
index 987a54dbc52..ea01797101c 100644
--- a/usr.sbin/smtpd/lka_session.c
+++ b/usr.sbin/smtpd/lka_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lka_session.c,v 1.90 2018/12/26 20:13:43 eric Exp $ */
+/* $OpenBSD: lka_session.c,v 1.91 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@poolp.org>
@@ -373,8 +373,10 @@ lka_expand(struct lka_session *lks, struct rule *rule, struct expandnode *xn)
}
/* gilles+hackers@ -> gilles@ */
- if ((tag = strchr(xn->u.user, *env->sc_subaddressing_delim)) != NULL)
+ if ((tag = strchr(xn->u.user, *env->sc_subaddressing_delim)) != NULL) {
*tag++ = '\0';
+ (void)strlcpy(xn->subaddress, tag, sizeof xn->subaddress);
+ }
userbase = table_find(env, dsp->u.local.table_userbase, NULL);
r = table_lookup(userbase, K_USERINFO, xn->u.user, &lk);
@@ -501,8 +503,10 @@ lka_submit(struct lka_session *lks, struct rule *rule, struct expandnode *xn)
ep->type = D_MDA;
ep->dest = lka_find_ancestor(xn, EXPAND_ADDRESS)->u.mailaddr;
- if (xn->type == EXPAND_USERNAME)
+ if (xn->type == EXPAND_USERNAME) {
(void)strlcpy(ep->mda_user, xn->u.user, sizeof(ep->mda_user));
+ (void)strlcpy(ep->mda_subaddress, xn->subaddress, sizeof(ep->mda_subaddress));
+ }
else {
user = !xn->parent->realuser ?
SMTPD_USER :
diff --git a/usr.sbin/smtpd/mda.c b/usr.sbin/smtpd/mda.c
index ed7911a2d01..06b88907d57 100644
--- a/usr.sbin/smtpd/mda.c
+++ b/usr.sbin/smtpd/mda.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mda.c,v 1.135 2018/10/30 14:17:17 gilles Exp $ */
+/* $OpenBSD: mda.c,v 1.136 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -55,6 +55,7 @@ struct mda_envelope {
char *dest;
char *user;
char *dispatcher;
+ char *mda_subaddress;
char *mda_exec;
};
@@ -274,6 +275,8 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
text_to_mailaddr(&deliver.dest, s->evp->dest);
if (s->evp->mda_exec)
(void)strlcpy(deliver.mda_exec, s->evp->mda_exec, sizeof deliver.mda_exec);
+ if (s->evp->mda_subaddress)
+ (void)strlcpy(deliver.mda_subaddress, s->evp->mda_subaddress, sizeof deliver.mda_subaddress);
(void)strlcpy(deliver.dispatcher, s->evp->dispatcher, sizeof deliver.dispatcher);
deliver.userinfo = s->user->userinfo;
@@ -812,6 +815,8 @@ mda_envelope(const struct envelope *evp)
e->dispatcher = xstrdup(evp->dispatcher);
if (evp->mda_exec[0])
e->mda_exec = xstrdup(evp->mda_exec);
+ if (evp->mda_subaddress[0])
+ e->mda_subaddress = xstrdup(evp->mda_subaddress);
stat_increment("mda.envelope", 1);
return (e);
}
diff --git a/usr.sbin/smtpd/mda_unpriv.c b/usr.sbin/smtpd/mda_unpriv.c
index 59c899416af..23754070539 100644
--- a/usr.sbin/smtpd/mda_unpriv.c
+++ b/usr.sbin/smtpd/mda_unpriv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mda_unpriv.c,v 1.4 2018/12/06 12:32:11 gilles Exp $ */
+/* $OpenBSD: mda_unpriv.c,v 1.5 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2018 Gilles Chehade <gilles@poolp.org>
@@ -45,7 +45,6 @@ mda_unpriv(struct dispatcher *dsp, struct deliver *deliver,
char mda_wrapper[LINE_MAX];
const char *mda_command;
const char *mda_command_wrap;
- const char *extension;
if (deliver->mda_exec[0])
mda_command = deliver->mda_exec;
@@ -73,9 +72,8 @@ mda_unpriv(struct dispatcher *dsp, struct deliver *deliver,
xasprintf(&mda_environ[idx++], "LOGNAME=%s", pw_name);
xasprintf(&mda_environ[idx++], "USER=%s", pw_name);
- if ((extension = strchr(deliver->rcpt.user, *env->sc_subaddressing_delim)) != NULL)
- if (strlen(extension+1))
- xasprintf(&mda_environ[idx++], "EXTENSION=%s", extension+1);
+ if (deliver->mda_subaddress[0])
+ xasprintf(&mda_environ[idx++], "EXTENSION=%s", deliver->mda_subaddress);
mda_environ[idx++] = (char *)NULL;
diff --git a/usr.sbin/smtpd/smtpd-defines.h b/usr.sbin/smtpd/smtpd-defines.h
index eba3ddd2196..3b9038cdbf6 100644
--- a/usr.sbin/smtpd/smtpd-defines.h
+++ b/usr.sbin/smtpd/smtpd-defines.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd-defines.h,v 1.9 2018/05/24 13:03:11 gilles Exp $ */
+/* $OpenBSD: smtpd-defines.h,v 1.10 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2013 Gilles Chehade <gilles@poolp.org>
@@ -30,6 +30,7 @@
/* buffer size for virtual username (can be email addresses) */
#define SMTPD_VUSERNAME_SIZE (255 + 1)
+#define SMTPD_SUBADDRESS_SIZE (255 + 1)
#define SMTPD_USER "_smtpd"
#define PATH_CHROOT "/var/empty"
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index 8ac0a6d8911..36a8d9fb015 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.611 2018/12/27 14:23:41 eric Exp $ */
+/* $OpenBSD: smtpd.h,v 1.612 2018/12/27 15:41:50 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -442,6 +442,7 @@ struct expandnode {
char buffer[EXPAND_BUFFER];
struct mailaddr mailaddr;
} u;
+ char subaddress[SMTPD_SUBADDRESS_SIZE];
};
struct expand {
@@ -491,6 +492,7 @@ struct envelope {
struct mailaddr dest;
char mda_user[SMTPD_VUSERNAME_SIZE];
+ char mda_subaddress[SMTPD_SUBADDRESS_SIZE];
char mda_exec[LINE_MAX];
enum delivery_type type;
@@ -650,6 +652,7 @@ struct deliver {
struct mailaddr rcpt;
struct mailaddr dest;
+ char mda_subaddress[SMTPD_SUBADDRESS_SIZE];
char mda_exec[LINE_MAX];
struct userinfo userinfo;