From 4356beb1a9765ccea83c22e4b38ee3100bc7f968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jaramago=20Fern=C3=A1ndez?= Date: Wed, 11 Mar 2020 16:58:52 +0100 Subject: [PATCH] Fix invalid free for ipv6 --- lib/MySQL_Thread.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 2072d9c0d..fba056943 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -227,8 +227,10 @@ int MySQL_Listeners_Manager::add(const char *iface, unsigned int num_threads, in char *address=NULL; char *port=NULL; int s = -1; char *h = NULL; + bool is_ipv6 = false; if (*(char *)iface == '[') { + is_ipv6 = true; char *p = strchr((char *)iface, ']'); if (p == NULL) { proxy_error("Invalid IPv6 address: %s\n", iface); @@ -268,8 +270,11 @@ int MySQL_Listeners_Manager::add(const char *iface, unsigned int num_threads, in s = ( atoi(port) ? listen_on_port(address, atoi(port), PROXYSQL_LISTEN_LEN) : listen_on_unix(address, PROXYSQL_LISTEN_LEN)); #endif /* SO_REUSEPORT */ if (s==-1) { - free(address); - free(port); + if (is_ipv6 == false) { + free(address); + free(port); + } + return s; } if (s>0) { @@ -277,8 +282,11 @@ int MySQL_Listeners_Manager::add(const char *iface, unsigned int num_threads, in iface_info *ifi=new iface_info((char *)iface, address, atoi(port), s); ifaces->add(ifi); } - free(address); - free(port); + if (is_ipv6 == false) { + free(address); + free(port); + } + return s; }