From 3be975ba5db182eb094cd9f0ee3d3e3fea4df870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sun, 29 Jul 2018 10:59:58 +0300 Subject: [PATCH] Fix fixing of std::string object names Comparing two fixed std::strings would have equal C strings but comparing with operator== they would be different. This was a result of the string modification done by fix_object_name. Converted the internal header into a C++ header, added std::string overload and fixed use of the function. --- server/core/config.cc | 18 +++++++++++++----- server/core/config_runtime.cc | 2 +- server/core/filter.cc | 2 +- server/core/gateway.cc | 2 +- server/core/internal/{config.h => config.hh} | 5 +---- server/core/load_utils.cc | 2 +- server/core/monitor.cc | 4 ++-- server/core/server.cc | 2 +- server/core/service.cc | 4 ++-- .../routing/binlogrouter/test/testbinlog.cc | 2 +- server/modules/routing/debugcli/debugcmd.cc | 2 +- 11 files changed, 25 insertions(+), 20 deletions(-) rename server/core/internal/{config.h => config.hh} (99%) diff --git a/server/core/config.cc b/server/core/config.cc index f3f42037d..50b7985b0 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -50,7 +50,7 @@ #include #include -#include "internal/config.h" +#include "internal/config.hh" #include "internal/event.hh" #include "internal/filter.hh" #include "internal/modules.h" @@ -550,6 +550,14 @@ void fix_object_name(char *name) replace_whitespace(name); } +void fix_object_name(std::string& name) +{ + char buf[name.size() + 1]; + strcpy(buf, name.c_str()); + fix_object_name(buf); + name.assign(buf); +} + static bool is_empty_string(const char* str) { for (const char* p = str; *p; p++) @@ -3206,9 +3214,9 @@ int configure_new_service(CONFIG_CONTEXT *obj) Service *service = static_cast(obj->element); ss_dassert(service); - for (auto&& a: mxs::strtok(config_get_string(obj->parameters, CN_SERVERS), ",")) + for (auto&& a : mxs::strtok(config_get_string(obj->parameters, CN_SERVERS), ",")) { - fix_object_name(&a[0]); + fix_object_name(a); if (SERVER* s = server_find_by_unique_name(a.c_str())) { @@ -3246,9 +3254,9 @@ int create_new_monitor(CONFIG_CONTEXT *obj, std::set& monitored_ser bool err = false; // TODO: Use server list parameter type for this - for (auto&& s: mxs::strtok(config_get_string(obj->parameters, CN_SERVERS), ",")) + for (auto&& s : mxs::strtok(config_get_string(obj->parameters, CN_SERVERS), ",")) { - fix_object_name(&s[0]); + fix_object_name(s); SERVER* server = server_find_by_unique_name(s.c_str()); if (!server) diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index 7e6405548..bc1d58ace 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -34,7 +34,7 @@ #include #include -#include "internal/config.h" +#include "internal/config.hh" #include "internal/monitor.h" #include "internal/modules.h" #include "internal/filter.hh" diff --git a/server/core/filter.cc b/server/core/filter.cc index 9de807f32..f12529d97 100644 --- a/server/core/filter.cc +++ b/server/core/filter.cc @@ -37,7 +37,7 @@ #include #include -#include "internal/config.h" +#include "internal/config.hh" #include "internal/modules.h" #include "internal/service.hh" diff --git a/server/core/gateway.cc b/server/core/gateway.cc index fe488fae4..c7f186d48 100644 --- a/server/core/gateway.cc +++ b/server/core/gateway.cc @@ -56,7 +56,7 @@ #include #include "internal/admin.hh" -#include "internal/config.h" +#include "internal/config.hh" #include "internal/maxscale.h" #include "internal/modules.h" #include "internal/monitor.h" diff --git a/server/core/internal/config.h b/server/core/internal/config.hh similarity index 99% rename from server/core/internal/config.h rename to server/core/internal/config.hh index 1d312d661..6edb61365 100644 --- a/server/core/internal/config.h +++ b/server/core/internal/config.hh @@ -21,8 +21,6 @@ #include #include -MXS_BEGIN_DECLS - #define DEFAULT_NBPOLLS 3 /**< Default number of non block polls before we block */ #define DEFAULT_POLLSLEEP 1000 /**< Default poll wait time (milliseconds) */ #define DEFAULT_NTHREADS 1 /**< Default number of polling threads */ @@ -182,6 +180,7 @@ void config_add_module_params_json(const MXS_MODULE* mod, * @param name Object name to fix */ void fix_object_name(char *name); +void fix_object_name(std::string& name); /** * @brief Serialize global options @@ -200,5 +199,3 @@ bool config_global_serialize(); bool export_config_file(const char* filename); bool is_normal_server_parameter(const char *param); - -MXS_END_DECLS diff --git a/server/core/load_utils.cc b/server/core/load_utils.cc index 3c00794a1..0fe49eef0 100644 --- a/server/core/load_utils.cc +++ b/server/core/load_utils.cc @@ -41,7 +41,7 @@ #include #include "internal/modules.h" -#include "internal/config.h" +#include "internal/config.hh" namespace { diff --git a/server/core/monitor.cc b/server/core/monitor.cc index 5750c396b..27ee3ec7d 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -41,7 +41,7 @@ #include #include -#include "internal/config.h" +#include "internal/config.hh" #include "internal/externcmd.h" #include "internal/monitor.h" #include "internal/modules.h" @@ -144,7 +144,7 @@ MXS_MONITOR* monitor_create(const char *name, const char *module, MXS_CONFIG_PAR for (auto&& s: mxs::strtok(config_get_string(params, CN_SERVERS), ",")) { - fix_object_name(&s[0]); + fix_object_name(s); monitor_add_server(mon, server_find_by_unique_name(s.c_str())); } diff --git a/server/core/server.cc b/server/core/server.cc index d0e93e862..6e3345eb9 100644 --- a/server/core/server.cc +++ b/server/core/server.cc @@ -44,7 +44,7 @@ #include "internal/monitor.h" #include "internal/poll.h" #include "internal/routingworker.hh" -#include "internal/config.h" +#include "internal/config.hh" #include "internal/service.hh" diff --git a/server/core/service.cc b/server/core/service.cc index 695d3ab19..1d003ac14 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -55,7 +55,7 @@ #include #include -#include "internal/config.h" +#include "internal/config.hh" #include "internal/filter.hh" #include "internal/modules.h" #include "internal/service.hh" @@ -1243,7 +1243,7 @@ bool service_set_filters(Service* service, const char* filters) for (auto&& f: mxs::strtok(filters, "|")) { - fix_object_name(&f[0]); + fix_object_name(f); if (FilterDef* def = filter_find(f.c_str())) { diff --git a/server/modules/routing/binlogrouter/test/testbinlog.cc b/server/modules/routing/binlogrouter/test/testbinlog.cc index d2f83e36e..fa0e43464 100644 --- a/server/modules/routing/binlogrouter/test/testbinlog.cc +++ b/server/modules/routing/binlogrouter/test/testbinlog.cc @@ -42,7 +42,7 @@ #include #include #include "../../../../core/internal/modules.h" -#include "../../../../core/internal/config.h" +#include "../../../../core/internal/config.hh" #include #include diff --git a/server/modules/routing/debugcli/debugcmd.cc b/server/modules/routing/debugcli/debugcmd.cc index 289175f9c..f884ae3c1 100644 --- a/server/modules/routing/debugcli/debugcmd.cc +++ b/server/modules/routing/debugcli/debugcmd.cc @@ -56,7 +56,7 @@ #include -#include "../../../core/internal/config.h" +#include "../../../core/internal/config.hh" #include "../../../core/internal/config_runtime.h" #include "../../../core/internal/maxscale.h" #include "../../../core/internal/modules.h"