[PATCH uhttpd 2/3] listen: Copy only parts of ai_addr

Oldřich Jedlička oldium.pro at gmail.com
Fri Jan 1 05:22:58 EST 2021


pá 1. 1. 2021 v 11:02 odesílatel Oldřich Jedlička <oldium.pro at gmail.com> napsal:
>
> Hi,
>
> pá 1. 1. 2021 v 2:20 odesílatel Hauke Mehrtens <hauke at hauke-m.de> napsal:
> >
> > ai_addr has different sizes for IPv4 and IPv6. Only copy the parts which
> > are actually used and not the full array, to not copy and uninitialized
> > memory.
> >
> > This fixes a warning found with the address sanitizer.
> >
> > Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
> > ---
> >  listen.c | 15 ++++++++++-----
> >  1 file changed, 10 insertions(+), 5 deletions(-)
> >
> > diff --git a/listen.c b/listen.c
> > index 2a54888..558e35e 100644
> > --- a/listen.c
> > +++ b/listen.c
> > @@ -29,7 +29,10 @@ struct listener {
> >         struct uloop_fd fd;
> >         int socket;
> >         int n_clients;
> > -       struct sockaddr_in6 addr;
> > +       union {
> > +               struct sockaddr_in6 addr6;
> > +               struct sockaddr_in addr;
> > +       };
> >         bool tls;
> >         bool blocked;
> >  };
> > @@ -189,7 +192,9 @@ int uh_socket_bind(const char *host, const char *port, bool tls)
> >
> >                 l->fd.fd = sock;
> >                 l->tls = tls;
> > -               l->addr = *(struct sockaddr_in6 *)p->ai_addr;
> > +               if (p->ai_addrlen < sizeof(l->addr))
>
> I think that this sizeof takes the smallest part of the (anonymous)
> union - sockaddr_in addr, not the whole union size. You either need to
> name the union and sizeof the whole content, or manually select the
> biggest entry for use in sizeof, which is addr6.

Also strict less-than doesn't look correct.

>
> > +                       goto error;
> > +               memcpy(&l->addr, p->ai_addr, p->ai_addrlen);
> >                 list_add_tail(&l->list, &listeners);
> >                 bound++;
> >
> > @@ -211,13 +216,13 @@ int uh_first_tls_port(int family)
> >         int tls_port = -1;
> >
> >         list_for_each_entry(l, &listeners, list) {
> > -               if (!l->tls || l->addr.sin6_family != family)
> > +               if (!l->tls || l->addr.sin_family != family)
> >                         continue;
> >
> > -               if (tls_port != -1 && ntohs(l->addr.sin6_port) != 443)
> > +               if (tls_port != -1 && ntohs(l->addr.sin_port) != 443)
> >                         continue;
> >
> > -               tls_port = ntohs(l->addr.sin6_port);
> > +               tls_port = ntohs(l->addr.sin_port);
> >         }
> >
> >         return tls_port;
> > --
> > 2.20.1
> >
> >
> > _______________________________________________
> > openwrt-devel mailing list
> > openwrt-devel at lists.openwrt.org
> > https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list