diff options
author | Gilles Chehade <gilles@poolp.org> | 2019-09-19 18:05:56 +0200 |
---|---|---|
committer | Gilles Chehade <gilles@poolp.org> | 2019-09-19 18:05:56 +0200 |
commit | 30a0de4187bd961d99a3a413b8c26b60ce12e86e (patch) | |
tree | ea0cf1ef4c60e753924ccb577004848806d422e0 | |
parent | Merge branch 'master' into portable (diff) | |
parent | sync (diff) | |
download | OpenSMTPD-30a0de4187bd961d99a3a413b8c26b60ce12e86e.tar.xz OpenSMTPD-30a0de4187bd961d99a3a413b8c26b60ce12e86e.zip |
Merge branch 'master' into portable
-rw-r--r-- | smtpd/envelope.c | 11 | ||||
-rw-r--r-- | smtpd/smtp_session.c | 21 | ||||
-rw-r--r-- | smtpd/to.c | 25 |
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, @@ -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) |