Theo pointed out that this breaks our example config:

/etc/examples/httpd.conf:13: server "example.com" defined twice

The problem is that * now means v4 and v6 and we have a listen on ::
in there, so we are listening twice on any v6 address.

I think the best way forward is an entry to current.html and adapting
(yet again) /etc/examples/httpd.conf:

diff --git etc/examples/httpd.conf etc/examples/httpd.conf
index 4e2e243bd65..6afe975120a 100644
--- etc/examples/httpd.conf
+++ etc/examples/httpd.conf
@@ -2,7 +2,6 @@
 
 server "example.com" {
        listen on * port 80
-       listen on :: port 80
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                root strip 2
@@ -14,7 +13,6 @@ server "example.com" {
 
 server "example.com" {
        listen on * tls port 443
-       listen on :: tls port 443
        tls {
                certificate "/etc/ssl/example.com.fullchain.pem"
                key "/etc/ssl/private/example.com.key"


On Mon, Apr 09, 2018 at 10:58:43AM +0200, Florian Obser wrote:
> 
> This shuffles things around to make httpd listen on v4 and v6 for *.
> 
> OK?
> 
> diff --git httpd.conf.5 httpd.conf.5
> index afda0ac132b..3194a3400c2 100644
> --- httpd.conf.5
> +++ httpd.conf.5
> @@ -52,12 +52,12 @@ addresses of the specified network interface.
>  If
>  .Sq *
>  is given as an address,
> -it will be used as an alias for
> +.Xr httpd 8
> +will listen on all IPv4 and IPv6 addresses.
>  .Ar 0.0.0.0
> -to listen on all IPv4 addresses.
> -Likewise,
> -.Sq ::
> -can be used to listen on all IPv6 addresses.
> +means to listen on all IPv4 addresses and
> +.Ar ::
> +all IPv6 addresses.
>  A
>  .Ar port
>  can be specified by number or name.
> diff --git httpd.h httpd.h
> index 1d49dfa230f..4d4d7eacd27 100644
> --- httpd.h
> +++ httpd.h
> @@ -53,6 +53,7 @@
>  #define HTTPD_LOGROOT                "/logs"
>  #define HTTPD_ACCESS_LOG     "access.log"
>  #define HTTPD_ERROR_LOG              "error.log"
> +#define HTTPD_MAX_ALIAS_IP   16
>  #define HTTPD_REALM_MAX              255
>  #define HTTPD_LOCATION_MAX   255
>  #define HTTPD_DEFAULT_TYPE   { "bin", "application", "octet-stream", NULL }
> diff --git parse.y parse.y
> index fcf1938c42d..cda1860f447 100644
> --- parse.y
> +++ parse.y
> @@ -106,7 +106,6 @@ int                host_if(const char *, struct 
> addresslist *,
>                   int, struct portrange *, const char *, int);
>  int           host(const char *, struct addresslist *,
>                   int, struct portrange *, const char *, int);
> -void          host_free(struct addresslist *);
>  struct server        *server_inherit(struct server *, struct server_config *,
>                   struct server_config *);
>  int           getservice(char *);
> @@ -415,39 +414,61 @@ serveroptsl     : LISTEN ON STRING opttls port {
>                               YYERROR;
>                       }
>  
> -                     if (srv->srv_conf.ss.ss_family != AF_UNSPEC) {
> -                             if ((alias = calloc(1,
> -                                 sizeof(*alias))) == NULL)
> -                                     fatal("out of memory");
> -
> -                             /* Add as an IP-based alias. */
> -                             s_conf = alias;
> -                     } else
> -                             s_conf = &srv->srv_conf;
> -
>                       TAILQ_INIT(&al);
> -                     if (host($3, &al, 1, &$5, NULL, -1) <= 0) {
> -                             yyerror("invalid listen ip: %s", $3);
> -                             free($3);
> -                             YYERROR;
> +                     if (strcmp("*", $3) == 0) {
> +                             if (host("0.0.0.0", &al, 1, &$5, NULL, -1) <=
> +                                 0) {
> +                                     yyerror("invalid listen ip: %s",
> +                                         "0.0.0.0");
> +                                     free($3);
> +                                     YYERROR;
> +                             }
> +                             if (host("::", &al, 1, &$5, NULL, -1) <= 0) {
> +                                     yyerror("invalid listen ip: %s", "::");
> +                                     free($3);
> +                                     YYERROR;
> +                             }
> +                     } else {
> +                             if (host($3, &al, HTTPD_MAX_ALIAS_IP, &$5, NULL,
> +                                 -1) <= 0) {
> +                                     yyerror("invalid listen ip: %s", $3);
> +                                     free($3);
> +                                     YYERROR;
> +                             }
>                       }
>                       free($3);
> -                     h = TAILQ_FIRST(&al);
> -                     memcpy(&s_conf->ss, &h->ss, sizeof(s_conf->ss));
> -                     s_conf->port = h->port.val[0];
> -                     s_conf->prefixlen = h->prefixlen;
> -                     host_free(&al);
> +                     while ((h = TAILQ_FIRST(&al)) != NULL) {
>  
> -                     if ($4)
> -                             s_conf->flags |= SRVFLAG_TLS;
> +                             if (srv->srv_conf.ss.ss_family != AF_UNSPEC) {
> +                                     if ((alias = calloc(1,
> +                                         sizeof(*alias))) == NULL)
> +                                             fatal("out of memory");
>  
> -                     if (alias != NULL) {
> -                             /* IP-based; use name match flags from parent */
> -                             alias->flags &= ~SRVFLAG_SERVER_MATCH;
> -                             alias->flags |= srv->srv_conf.flags &
> -                                 SRVFLAG_SERVER_MATCH;
> -                             TAILQ_INSERT_TAIL(&srv->srv_hosts,
> -                                 alias, entry);
> +                                     /* Add as an IP-based alias. */
> +                                     s_conf = alias;
> +                             } else
> +                                     s_conf = &srv->srv_conf;
> +
> +                             memcpy(&s_conf->ss, &h->ss, sizeof(s_conf->ss));
> +                             s_conf->port = h->port.val[0];
> +                             s_conf->prefixlen = h->prefixlen;
> +
> +                             if ($4)
> +                                     s_conf->flags |= SRVFLAG_TLS;
> +
> +                             if (alias != NULL) {
> +                                     /*
> +                                      * IP-based; use name match flags from
> +                                      * parent
> +                                      */
> +                                     alias->flags &= ~SRVFLAG_SERVER_MATCH;
> +                                     alias->flags |= srv->srv_conf.flags &
> +                                         SRVFLAG_SERVER_MATCH;
> +                                     TAILQ_INSERT_TAIL(&srv->srv_hosts,
> +                                         alias, entry);
> +                             }
> +                             TAILQ_REMOVE(&al, h, entry);
> +                             free(h);
>                       }
>               }
>               | ALIAS optmatch STRING         {
> @@ -1990,9 +2011,6 @@ host(const char *s, struct addresslist *al, int max,
>  {
>       struct address *h;
>  
> -     if (strcmp("*", s) == 0)
> -             s = "0.0.0.0";
> -
>       h = host_v4(s);
>  
>       /* IPv6 address? */
> @@ -2021,17 +2039,6 @@ host(const char *s, struct addresslist *al, int max,
>       return (host_dns(s, al, max, port, ifname, ipproto));
>  }
>  
> -void
> -host_free(struct addresslist *al)
> -{
> -     struct address   *h;
> -
> -     while ((h = TAILQ_FIRST(al)) != NULL) {
> -             TAILQ_REMOVE(al, h, entry);
> -             free(h);
> -     }
> -}
> -
>  struct server *
>  server_inherit(struct server *src, struct server_config *alias,
>      struct server_config *addr)
> 
> 
> 
> 
> -- 
> I'm not entirely sure you are real.
> 

-- 
I'm not entirely sure you are real.

Reply via email to