From: Willy Tarreau Date: Fri, 4 Dec 2020 13:28:23 +0000 (+0100) Subject: BUG/MINOR: listener: use sockaddr_in6 for IPv6 X-Git-Tag: v2.4-dev3~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7da02dd308baa40df43b87b5fdca3af8c49e48a8;p=thirdparty%2Fhaproxy.git BUG/MINOR: listener: use sockaddr_in6 for IPv6 A copy-paste bug between {tcp,udp}{4,6}_add_listener() resulted in using a struct sockaddr_in to set the TCP/UDP port while it ought to be a struct sockaddr_in6. Fortunately, the port has the same offset (2) in both so it was harmless. A cleaner way to proceed would be to have a set_port function exported by the address family layer. This needs to be backported to 2.3. --- diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 06adf9b478..e8e6c766c9 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -743,7 +743,7 @@ static void tcpv6_add_listener(struct listener *listener, int port) return; listener_set_state(listener, LI_ASSIGNED); listener->rx.proto = &proto_tcpv6; - ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port); + ((struct sockaddr_in6 *)(&listener->rx.addr))->sin6_port = htons(port); LIST_ADDQ(&proto_tcpv6.receivers, &listener->rx.proto_list); proto_tcpv6.nb_receivers++; } diff --git a/src/proto_udp.c b/src/proto_udp.c index ae5562afb2..e38ab0d114 100644 --- a/src/proto_udp.c +++ b/src/proto_udp.c @@ -167,7 +167,7 @@ static void udp6_add_listener(struct listener *listener, int port) return; listener_set_state(listener, LI_ASSIGNED); listener->rx.proto = &proto_udp6; - ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port); + ((struct sockaddr_in6 *)(&listener->rx.addr))->sin6_port = htons(port); LIST_ADDQ(&proto_udp6.receivers, &listener->rx.proto_list); proto_udp6.nb_receivers++; }