aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilles Chehade <gilles@poolp.org>2019-09-19 18:05:56 +0200
committerGilles Chehade <gilles@poolp.org>2019-09-19 18:05:56 +0200
commit30a0de4187bd961d99a3a413b8c26b60ce12e86e (patch)
treeea0cf1ef4c60e753924ccb577004848806d422e0
parentMerge branch 'master' into portable (diff)
parentsync (diff)
downloadOpenSMTPD-30a0de4187bd961d99a3a413b8c26b60ce12e86e.tar.xz
OpenSMTPD-30a0de4187bd961d99a3a413b8c26b60ce12e86e.zip
Merge branch 'master' into portable
-rw-r--r--smtpd/envelope.c11
-rw-r--r--smtpd/smtp_session.c21
-rw-r--r--smtpd/to.c25
3 files changed, 44 insertions, 13 deletions
diff --git a/smtpd/envelope.c b/smtpd/envelope.c
index b32688ea..e153efdd 100644
--- a/smtpd/envelope.c
+++ b/smtpd/envelope.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: envelope.c,v 1.45 2019/08/14 21:11:25 gilles Exp $ */
+/* $OpenBSD: envelope.c,v 1.46 2019/09/19 16:00:59 gilles Exp $ */
/*
* Copyright (c) 2013 Eric Faurot <eric@openbsd.org>
@@ -299,6 +299,7 @@ ascii_load_sockaddr(struct sockaddr_storage *ss, char *buf)
ss->ss_family = AF_LOCAL;
}
else if (strncasecmp("IPv6:", buf, 5) == 0) {
+ /* XXX - remove this after 6.6 release */
if (inet_pton(AF_INET6, buf + 5, &ssin6.sin6_addr) != 1)
return 0;
ssin6.sin6_family = AF_INET6;
@@ -307,6 +308,14 @@ ascii_load_sockaddr(struct sockaddr_storage *ss, char *buf)
ss->ss_len = sizeof(struct sockaddr_in6);
#endif
}
+ else if (buf[0] == '[' && buf[strlen(buf)-1] == ']') {
+ buf[strlen(buf)-1] = '\0';
+ if (inet_pton(AF_INET6, buf+1, &ssin6.sin6_addr) != 1)
+ return 0;
+ ssin6.sin6_family = AF_INET6;
+ memcpy(ss, &ssin6, sizeof(ssin6));
+ ss->ss_len = sizeof(struct sockaddr_in6);
+ }
else {
if (inet_pton(AF_INET, buf, &ssin.sin_addr) != 1)
return 0;
diff --git a/smtpd/smtp_session.c b/smtpd/smtp_session.c
index a388432e..29bb5ff2 100644
--- a/smtpd/smtp_session.c
+++ b/smtpd/smtp_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtp_session.c,v 1.410 2019/09/11 04:19:19 martijn Exp $ */
+/* $OpenBSD: smtp_session.c,v 1.411 2019/09/19 16:00:59 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -1750,10 +1750,13 @@ smtp_proceed_helo(struct smtp_session *s, const char *args)
report_smtp_link_identify("smtp-in", s->id, "HELO", s->helo);
smtp_enter_state(s, STATE_HELO);
- smtp_reply(s, "250 %s Hello %s [%s], pleased to meet you",
+
+ smtp_reply(s, "250 %s Hello %s %s%s%s, pleased to meet you",
s->smtpname,
s->helo,
- ss_to_text(&s->ss));
+ s->ss.ss_family == AF_INET6 ? "" : "[",
+ ss_to_text(&s->ss),
+ s->ss.ss_family == AF_INET6 ? "" : "]");
}
static void
@@ -1767,10 +1770,12 @@ smtp_proceed_ehlo(struct smtp_session *s, const char *args)
report_smtp_link_identify("smtp-in", s->id, "EHLO", s->helo);
smtp_enter_state(s, STATE_HELO);
- smtp_reply(s, "250-%s Hello %s [%s], pleased to meet you",
+ smtp_reply(s, "250-%s Hello %s %s%s%s, pleased to meet you",
s->smtpname,
s->helo,
- ss_to_text(&s->ss));
+ s->ss.ss_family == AF_INET6 ? "" : "[",
+ ss_to_text(&s->ss),
+ s->ss.ss_family == AF_INET6 ? "" : "]");
smtp_reply(s, "250-8BITMIME");
smtp_reply(s, "250-ENHANCEDSTATUSCODES");
@@ -2841,10 +2846,12 @@ smtp_message_begin(struct smtp_tx *tx)
m_printf(tx, "Received: ");
if (!(s->listener->flags & F_MASK_SOURCE)) {
- m_printf(tx, "from %s (%s [%s])",
+ m_printf(tx, "from %s (%s %s%s%s)",
s->helo,
s->rdns,
- ss_to_text(&s->ss));
+ s->ss.ss_family == AF_INET6 ? "" : "[",
+ ss_to_text(&s->ss),
+ s->ss.ss_family == AF_INET6 ? "" : "]");
}
m_printf(tx, "\n\tby %s (%s) with %sSMTP%s%s id %08x",
s->smtpname,
diff --git a/smtpd/to.c b/smtpd/to.c
index d8436b34..0e6b7d1d 100644
--- a/smtpd/to.c
+++ b/smtpd/to.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: to.c,v 1.42 2019/09/02 21:59:27 gilles Exp $ */
+/* $OpenBSD: to.c,v 1.43 2019/09/19 16:00:59 gilles Exp $ */
/*
* Copyright (c) 2009 Jacek Masiulaniec <jacekm@dobremiasto.net>
@@ -175,10 +175,9 @@ sa_to_text(const struct sockaddr *sa)
const struct in6_addr *in6_addr;
in6 = (const struct sockaddr_in6 *)sa;
- (void)strlcpy(buf, "IPv6:", sizeof(buf));
- p = buf + 5;
+ p = buf;
in6_addr = &in6->sin6_addr;
- (void)bsnprintf(p, NI_MAXHOST, "%s", in6addr_to_text(in6_addr));
+ (void)bsnprintf(p, NI_MAXHOST, "[%s]", in6addr_to_text(in6_addr));
}
return (buf);
@@ -281,6 +280,8 @@ text_to_netaddr(struct netaddr *netaddr, const char *s)
struct sockaddr_in ssin;
struct sockaddr_in6 ssin6;
int bits;
+ char buf[NI_MAXHOST];
+ size_t len;
memset(&ssin, 0, sizeof(struct sockaddr_in));
memset(&ssin6, 0, sizeof(struct sockaddr_in6));
@@ -297,7 +298,21 @@ text_to_netaddr(struct netaddr *netaddr, const char *s)
ss.ss_len = sizeof(struct sockaddr_in);
#endif
} else {
- bits = inet_net_pton(AF_INET6, s, &ssin6.sin6_addr,
+ if (s[0] != '[') {
+ if ((len = strlcpy(buf, s, sizeof buf)) >= sizeof buf)
+ return 0;
+ }
+ else {
+ s++;
+ if (strncasecmp("IPv6:", s, 5) == 0)
+ s += 5;
+ if ((len = strlcpy(buf, s, sizeof buf)) >= sizeof buf)
+ return 0;
+ if (buf[len-1] != ']')
+ return 0;
+ buf[len-1] = 0;
+ }
+ bits = inet_net_pton(AF_INET6, buf, &ssin6.sin6_addr,
sizeof(struct in6_addr));
if (bits == -1) {
if (errno != EAFNOSUPPORT)