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 <ha...@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))
+                       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@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to