Hi,

updated diff after millert@ and beck@ remarks:
- use union to collapse in_addr + in6_addr
- doesn't allocate buffer and directly use s->relay->domain->name

Thanks.
-- 
Sebastien Marie


diff 73b535ef4537e8454483912fc3420bc304759e96 /home/semarie/repos/openbsd/src
blob - d384692a0e43de47d645142a6b99e72b7d83b687
file + usr.sbin/smtpd/mta_session.c
--- usr.sbin/smtpd/mta_session.c
+++ usr.sbin/smtpd/mta_session.c
@@ -26,6 +26,7 @@
 #include <sys/stat.h>
 #include <sys/uio.h>
 
+#include <arpa/inet.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
@@ -1604,6 +1605,10 @@ mta_cert_init_cb(void *arg, int status, const char *na
        struct mta_session *s = arg;
        void *ssl;
        char *xname = NULL, *xcert = NULL;
+       union {
+               struct in_addr in4;
+               struct in6_addr in6;
+       } addrbuf;
 
        if (s->flags & MTA_WAIT)
                mta_tree_pop(&wait_tls_init, s->id);
@@ -1623,6 +1628,22 @@ mta_cert_init_cb(void *arg, int status, const char *na
        free(xcert);
        if (ssl == NULL)
                fatal("mta: ssl_mta_init");
+
+       /*
+        * RFC4366 (SNI): Literal IPv4 and IPv6 addresses are not
+        * permitted in "HostName".
+        */
+       if (s->relay->domain->as_host == 1) {
+               if (inet_pton(AF_INET, s->relay->domain->name, &addrbuf) != 1 &&
+                   inet_pton(AF_INET6, s->relay->domain->name, &addrbuf) != 1) 
{
+                       log_debug("%016"PRIx64" mta tls setting SNI name=%s",
+                           s->id, s->relay->domain->name);
+                       if (SSL_set_tlsext_host_name(ssl, 
s->relay->domain->name) == 0)
+                               log_warnx("%016"PRIx64" mta tls setting SNI 
failed",
+                                  s->id);
+               }
+       }
+
        io_start_tls(s->io, ssl);
 }
 

Reply via email to