untrusted comment: verify with openbsd-71-base.pub RWR2eHwZTOEiTZA9HmHtIjH4Sp6N/zgeleYD+WVnnHFNQSsLRitnJEYYqa38eUjaPc/Bf9SbKWS3N50vsoO7hTPmUQbCZ9Un4QU= OpenBSD 7.1 errata 024, February 7, 2023: smtpd(8) could abort due to a connection from a local, scoped ipv6 address. Apply by doing: signify -Vep /etc/signify/openbsd-71-base.pub -x 024_smtpd.patch.sig \ -m - | (cd /usr/src && patch -p0) And then rebuild and install smtpd: cd /usr/src/usr.sbin/smtpd make obj make make install Index: usr.sbin/smtpd/envelope.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/envelope.c,v diff -u -p -u -r1.49 envelope.c --- usr.sbin/smtpd/envelope.c 14 Jun 2021 17:58:15 -0000 1.49 +++ usr.sbin/smtpd/envelope.c 31 Jan 2023 17:10:21 -0000 @@ -270,32 +270,28 @@ ascii_load_string(char *dest, char *buf, static int ascii_load_sockaddr(struct sockaddr_storage *ss, char *buf) { - struct sockaddr_in6 ssin6; - struct sockaddr_in ssin; - - memset(&ssin, 0, sizeof ssin); - memset(&ssin6, 0, sizeof ssin6); - if (!strcmp("local", 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; - memcpy(ss, &ssin6, sizeof(ssin6)); - ss->ss_len = sizeof(struct sockaddr_in6); - } else if (buf[0] == '[' && buf[strlen(buf)-1] == ']') { + struct addrinfo hints, *res0; + buf[strlen(buf)-1] = '\0'; - if (inet_pton(AF_INET6, buf+1, &ssin6.sin6_addr) != 1) + + /* getaddrinfo() is used to support scoped addresses. */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET6; + hints.ai_flags = AI_NUMERICHOST; + if (getaddrinfo(buf+1, NULL, &hints, &res0) != 0) return 0; - ssin6.sin6_family = AF_INET6; - memcpy(ss, &ssin6, sizeof(ssin6)); - ss->ss_len = sizeof(struct sockaddr_in6); + memcpy(ss, res0->ai_addr, res0->ai_addrlen); + ss->ss_len = res0->ai_addrlen; + freeaddrinfo(res0); } else { + struct sockaddr_in ssin; + + memset(&ssin, 0, sizeof ssin); if (inet_pton(AF_INET, buf, &ssin.sin_addr) != 1) return 0; ssin.sin_family = AF_INET;