From 4c0fcc2314f746b05bd5a613f188784761dc9ac9 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 20 Sep 2018 10:48:35 +0200 Subject: [PATCH] BUG/MINOR: tools: fix set_net_port() / set_host_port() on IPv4 These two functions were apparently written on the same model as their parents when added by commit 11bcb6c4f ("[MEDIUM] IPv6 support for syslog") except that they perform an assignment instead of a return, and as a result fall through the next case where the assigned value may possibly be partially overwritten. At least under Linux the port offset is the same in both sockaddr_in and sockaddr_in6 so the value is written twice without side effects. This needs to be backported as far as 1.5. --- include/common/standard.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/common/standard.h b/include/common/standard.h index ad1a76748..5c7d15229 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -1007,8 +1007,10 @@ static inline int set_net_port(struct sockaddr_storage *addr, int port) switch (addr->ss_family) { case AF_INET: ((struct sockaddr_in *)addr)->sin_port = port; + break; case AF_INET6: ((struct sockaddr_in6 *)addr)->sin6_port = port; + break; } return 0; } @@ -1019,8 +1021,10 @@ static inline int set_host_port(struct sockaddr_storage *addr, int port) switch (addr->ss_family) { case AF_INET: ((struct sockaddr_in *)addr)->sin_port = htons(port); + break; case AF_INET6: ((struct sockaddr_in6 *)addr)->sin6_port = htons(port); + break; } return 0; }