aboutsummaryrefslogtreecommitdiffstats
path: root/smtpd/to.c
diff options
context:
space:
mode:
authorGilles Chehade <gilles@poolp.org>2019-09-19 18:05:46 +0200
committerGilles Chehade <gilles@poolp.org>2019-09-19 18:05:46 +0200
commitf61ea7bdea3ed1d892463402ead26bc1026d6dce (patch)
treeefa9b5df9dd0581c079d72022a97f2b59f4227a4 /smtpd/to.c
parentsync (diff)
downloadOpenSMTPD-f61ea7bdea3ed1d892463402ead26bc1026d6dce.tar.xz
OpenSMTPD-f61ea7bdea3ed1d892463402ead26bc1026d6dce.zip
sync
Diffstat (limited to 'smtpd/to.c')
-rw-r--r--smtpd/to.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/smtpd/to.c b/smtpd/to.c
index 1ad991e2..addeda1c 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>
@@ -169,10 +169,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);
@@ -270,6 +269,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));
@@ -284,7 +285,21 @@ text_to_netaddr(struct netaddr *netaddr, const char *s)
memcpy(&ss, &ssin, sizeof(ssin));
ss.ss_len = sizeof(struct sockaddr_in);
} 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)
return 0;