Heap allocated host pointer for async mysql_real_connect_start function

Few fixes
pull/4022/head
Rahim Kanji 3 years ago
parent 85fe4e1fdc
commit eef3ddfcd6

@ -131,6 +131,7 @@ class MySrvC { // MySQL Server Container
public:
MyHGC *myhgc;
char *address;
char* resolved_ip;
uint16_t port;
uint16_t gtid_port;
uint16_t flags;

@ -309,7 +309,7 @@ public:
bool add(const std::string& hostname, const std::string& ip);
void remove(const std::string& hostname);
void clear();
std::string lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) const;
std::string lookup(const std::string& hostname) const;
void bulk_update(const std::list<std::pair<DNS_Cache_Record, OPERATION>> bulk_record);
private:
@ -329,8 +329,8 @@ struct DNS_Resolve_Data {
class MySQL_Monitor {
public:
static std::string dns_lookup(const std::string& hostname);
static std::string dns_lookup(const char* hostname);
static std::string dns_lookup(const std::string& hostname, bool return_hostname_if_lookup_fails = true);
static std::string dns_lookup(const char* hostname, bool return_hostname_if_lookup_fails = true);
private:
std::vector<table_def_t *> *tables_defs_monitor;

@ -839,7 +839,7 @@ void MySrvConnList::drop_all_connections() {
}
MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) {
MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) : resolved_ip(NULL) {
address=strdup(add);
port=p;
gtid_port=gp;
@ -951,6 +951,7 @@ void MySrvC::shun_and_killall() {
MySrvC::~MySrvC() {
if (address) free(address);
if (comment) free(comment);
if (resolved_ip) free(resolved_ip);
delete ConnectionsUsed;
delete ConnectionsFree;
}

@ -5425,28 +5425,31 @@ void MySQL_Monitor::evaluate_aws_aurora_results(unsigned int wHG, unsigned int r
#endif // TEST_AURORA
}
std::string MySQL_Monitor::dns_lookup(const std::string& hostname) {
std::string MySQL_Monitor::dns_lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) {
// if IP was provided, no need to do lookup
if (validate_ip(hostname))
return hostname;
static thread_local std::shared_ptr<DNS_Cache> dns_cache_thread;
const std::string& hostname_trim = trim(hostname);
std::string ip;
if (!dns_cache_thread && GloMyMon)
dns_cache_thread = GloMyMon->dns_cache;
if (dns_cache_thread) {
ip = dns_cache_thread->lookup(hostname_trim, false) ;
ip = dns_cache_thread->lookup(trim(hostname)) ;
if (ip.empty() && return_hostname_if_lookup_fails) {
ip = hostname;
}
}
return !ip.empty() ? ip : hostname_trim;
return ip;
}
std::string MySQL_Monitor::dns_lookup(const char* hostname) {
return MySQL_Monitor::dns_lookup(std::string(hostname));
std::string MySQL_Monitor::dns_lookup(const char* hostname, bool return_hostname_if_lookup_fails) {
return MySQL_Monitor::dns_lookup(std::string(hostname), return_hostname_if_lookup_fails);
}
bool DNS_Cache::add(const std::string& hostname, const std::string& ip) {
@ -5456,7 +5459,7 @@ bool DNS_Cache::add(const std::string& hostname, const std::string& ip) {
int rc = pthread_rwlock_wrlock(&rwlock_);
assert(rc == 0);
try {
records.emplace(hostname, ip);
records[hostname] = ip;
}
catch (...) {}
rc = pthread_rwlock_unlock(&rwlock_);
@ -5468,7 +5471,7 @@ bool DNS_Cache::add(const std::string& hostname, const std::string& ip) {
return true;
}
std::string DNS_Cache::lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) const {
std::string DNS_Cache::lookup(const std::string& hostname) const {
if (!enabled) return "";
std::string ip;
@ -5489,10 +5492,6 @@ std::string DNS_Cache::lookup(const std::string& hostname, bool return_hostname_
__sync_fetch_and_add(&GloMyMon->dns_cache_lookup_success, 1);
}
if (ip.empty() && return_hostname_if_lookup_fails) {
ip = hostname;
}
return ip;
}

@ -808,7 +808,29 @@ void MySQL_Connection::connect_start() {
}
}
if (parent->port) {
async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, MySQL_Monitor::dns_lookup(parent->address).c_str(), userinfo->username, auth_password, userinfo->schemaname, parent->port, NULL, client_flags);
char* host_ip = NULL;
const std::string& res_ip = MySQL_Monitor::dns_lookup(parent->address, false);
if (!res_ip.empty()) {
if (parent->resolved_ip) {
if (strcmp(parent->resolved_ip, res_ip.c_str()) != 0) {
free(parent->resolved_ip);
parent->resolved_ip = strdup(res_ip.c_str());
}
}
else {
parent->resolved_ip = strdup(res_ip.c_str());
}
host_ip = parent->resolved_ip;
}
else {
host_ip = parent->address;
}
async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, host_ip, userinfo->username, auth_password, userinfo->schemaname, parent->port, NULL, client_flags);
} else {
async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, "localhost", userinfo->username, auth_password, userinfo->schemaname, parent->port, parent->address, client_flags);
}

Loading…
Cancel
Save