Fix listener search functions
The functions that searched for listeners compared both sockets and addresses in the same function. This made its use error prone and caused false positives in some cases.
This commit is contained in:
@ -4172,17 +4172,22 @@ int create_new_listener(CONFIG_CONTEXT* obj)
|
||||
address = "";
|
||||
}
|
||||
|
||||
if (auto l = listener_find_by_config(socket, address, port))
|
||||
if (socket_defined)
|
||||
{
|
||||
if (auto l = listener_find_by_socket(socket))
|
||||
{
|
||||
MXS_ERROR("Creation of listener '%s' for service '%s' failed, because "
|
||||
"listener '%s' already listens on socket %s.",
|
||||
obj->name(), service->name(), l->name(), socket.c_str());
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (auto l = listener_find_by_address(address, port))
|
||||
{
|
||||
string socket_type = socket_defined ? "socket" : "port";
|
||||
string socket_definition = socket_defined ? socket : obj->m_parameters.get_string(CN_PORT);
|
||||
MXS_ERROR("Creation of listener '%s' for service '%s' failed, because "
|
||||
"listener '%s' already listens on the %s %s.",
|
||||
obj->name(),
|
||||
service->name(),
|
||||
l->name(),
|
||||
socket_type.c_str(),
|
||||
socket_definition.c_str());
|
||||
"listener '%s' already listens on port %s.",
|
||||
obj->name(), service->name(), l->name(),
|
||||
obj->m_parameters.get_string(CN_PORT).c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1172,7 +1172,7 @@ bool runtime_create_listener(Service* service,
|
||||
{
|
||||
config_runtime_error("Listener '%s' already exists", name);
|
||||
}
|
||||
else if (SListener l = listener_find_by_config("", addr, u_port))
|
||||
else if (SListener l = listener_find_by_address(addr, u_port))
|
||||
{
|
||||
config_runtime_error("Listener '%s' already listens on [%s]:%u", l->name(), addr, u_port);
|
||||
}
|
||||
|
@ -338,9 +338,24 @@ static bool is_all_iface(const std::string& a, const std::string& b)
|
||||
return addresses.count(a) || addresses.count(b);
|
||||
}
|
||||
|
||||
SListener listener_find_by_config(const std::string& socket,
|
||||
const std::string& address,
|
||||
unsigned short port)
|
||||
SListener listener_find_by_socket(const std::string& socket)
|
||||
{
|
||||
SListener rval;
|
||||
std::lock_guard<std::mutex> guard(listener_lock);
|
||||
|
||||
for (const auto& listener : all_listeners)
|
||||
{
|
||||
if (listener->address() == socket)
|
||||
{
|
||||
rval = listener;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
SListener listener_find_by_address(const std::string& address, unsigned short port)
|
||||
{
|
||||
SListener rval;
|
||||
std::lock_guard<std::mutex> guard(listener_lock);
|
||||
@ -348,8 +363,7 @@ SListener listener_find_by_config(const std::string& socket,
|
||||
for (const auto& listener : all_listeners)
|
||||
{
|
||||
if (port == listener->port()
|
||||
&& (listener->address() == address || listener->address() == socket
|
||||
|| is_all_iface(listener->address(), address)))
|
||||
&& (listener->address() == address || is_all_iface(listener->address(), address)))
|
||||
{
|
||||
rval = listener;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user