diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 0eb8437d0..c64a25ff7 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -122,7 +122,7 @@ enum MySQL_Thread_status_variable { st_var_END }; -class MySQL_Thread +class __attribute__((aligned(64))) MySQL_Thread { private: unsigned int servers_table_version_previous; diff --git a/include/proxysql_glovars.hpp b/include/proxysql_glovars.hpp index 70d02cafd..8a0dbe02c 100644 --- a/include/proxysql_glovars.hpp +++ b/include/proxysql_glovars.hpp @@ -26,6 +26,9 @@ inline void replace_checksum_zeros(char* checksum) { } } +#ifndef ProxySQL_Checksum_Value_LENGTH +#define ProxySQL_Checksum_Value_LENGTH 20 +#endif class ProxySQL_Checksum_Value { public: char *checksum; @@ -33,15 +36,15 @@ class ProxySQL_Checksum_Value { unsigned long long epoch; bool in_shutdown; ProxySQL_Checksum_Value() { - checksum = (char *)malloc(20); - memset(checksum,0,20); + checksum = (char *)malloc(ProxySQL_Checksum_Value_LENGTH); + memset(checksum,0,ProxySQL_Checksum_Value_LENGTH); version = 0; epoch = 0; in_shutdown = false; } void set_checksum(char *c) { - memset(checksum,0,20); - strncpy(checksum,c,18); + memset(checksum,0,ProxySQL_Checksum_Value_LENGTH); + strncpy(checksum,c,ProxySQL_Checksum_Value_LENGTH); replace_checksum_zeros(checksum); } ~ProxySQL_Checksum_Value() { diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 3cbe229e3..38e2e52bd 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -1863,7 +1863,7 @@ bool MySQL_HostGroups_Manager::commit( { uint64_t hash1 = 0, hash2 = 0; SpookyHash myhash; - char buf[80]; + char buf[ProxySQL_Checksum_Value_LENGTH]; bool init = false; { mydb->execute("DELETE FROM mysql_servers"); @@ -4762,7 +4762,7 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listsess, user, session_type); + unsigned char md1_buf[SHA_DIGEST_LENGTH]; + unsigned char md2_buf[SHA_DIGEST_LENGTH]; + SHA1(pass,pass_len,md1_buf); + SHA1(md1_buf,SHA_DIGEST_LENGTH,md2_buf); + +#ifdef DEBUG // FIXME: remove this in future release uint8_t hash_stage1[SHA_DIGEST_LENGTH]; uint8_t hash_stage2[SHA_DIGEST_LENGTH]; SHA_CTX sha1_context; @@ -2153,25 +2159,21 @@ __do_auth: SHA1_Init(&sha1_context); SHA1_Update(&sha1_context,hash_stage1,SHA_DIGEST_LENGTH); SHA1_Final(hash_stage2, &sha1_context); - - unsigned char md1_buf[SHA_DIGEST_LENGTH]; - unsigned char md2_buf[SHA_DIGEST_LENGTH]; - SHA1(pass,pass_len,md1_buf); assert(memcmp(md1_buf,hash_stage1,SHA_DIGEST_LENGTH)==0); - SHA1(md1_buf,SHA_DIGEST_LENGTH,md2_buf); assert(memcmp(md2_buf,hash_stage2,SHA_DIGEST_LENGTH)==0); +#endif - char *double_hashed_password = sha1_pass_hex((char *)hash_stage2); // note that sha1_pass_hex() returns a new buffer + char *double_hashed_password = sha1_pass_hex((char *)md2_buf); // note that sha1_pass_hex() returns a new buffer if (strcasecmp(double_hashed_password,password)==0) { ret = true; if (sha1_pass==NULL) { // currently proxysql doesn't know any sha1_pass for that specific user, let's set it! - GloMyAuth->set_SHA1((char *)user, USERNAME_FRONTEND,hash_stage1); + GloMyAuth->set_SHA1((char *)user, USERNAME_FRONTEND,md1_buf); } if (userinfo->sha1_pass) free(userinfo->sha1_pass); - userinfo->sha1_pass=sha1_pass_hex((char *)hash_stage1); + userinfo->sha1_pass=sha1_pass_hex((char *)md1_buf); } else { ret = false; } diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 7c7988658..613451adc 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -6436,7 +6436,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C // try case listed in #1373 // SET @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 // this is not a complete solution. A right solution involves true parsing - int query_no_space_length = nq.length(); + size_t query_no_space_length = nq.length(); char *query_no_space=(char *)malloc(query_no_space_length+1); memcpy(query_no_space,nq.c_str(),query_no_space_length); query_no_space[query_no_space_length]='\0'; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index d3200e1b3..e4dc815fe 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -3682,7 +3682,7 @@ void admin_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { if (!strncasecmp("LOGENTRY ", query_no_space, strlen("LOGENTRY "))) { proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received command LOGENTRY: %s\n", query_no_space + strlen("LOGENTRY ")); proxy_info("Received command LOGENTRY: %s\n", query_no_space + strlen("LOGENTRY ")); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, NULL); + SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, 0); run_query=false; goto __run_query; } @@ -7468,7 +7468,7 @@ bool ProxySQL_Admin::ProxySQL_Test___Verify_mysql_query_rules_fast_routing( vector th_hashmaps {}; if (maps_per_thread) { - for (uint32_t i = 0; i < ths; i++) { + for (int i = 0; i < ths; i++) { th_hashmaps.push_back(GloQPro->create_fast_routing_hashmap(resultset2)); } } @@ -7505,7 +7505,7 @@ bool ProxySQL_Admin::ProxySQL_Test___Verify_mysql_query_rules_fast_routing( unsigned long long curtime1 = monotonic_time() / 1000; std::vector workers {}; - for (uint32_t i = 0; i < ths; i++) { + for (int i = 0; i < ths; i++) { khash_t(khStrInt)* hashmap = maps_per_thread ? th_hashmaps[i].rules_fast_routing : nullptr; workers.push_back(std::thread(perform_searches, hashmap, resultset, i, lock)); } @@ -7525,7 +7525,7 @@ bool ProxySQL_Admin::ProxySQL_Test___Verify_mysql_query_rules_fast_routing( for (int i=1 ; i < cnt; i++) { std::vector workers {}; - for (uint32_t i = 0; i < ths; i++) { + for (int i = 0; i < ths; i++) { khash_t(khStrInt)* hashmap = maps_per_thread ? th_hashmaps[i].rules_fast_routing : nullptr; workers.push_back(std::thread(perform_searches, hashmap, resultset, i, lock)); } @@ -11141,6 +11141,12 @@ SQLite3_result* ProxySQL_Admin::__add_active_users( if (r->fields[1][0]=='*') { // the password is already hashed password=strdup(r->fields[1]); } else { // we must hash it + unsigned char md1_buf[SHA_DIGEST_LENGTH]; + unsigned char md2_buf[SHA_DIGEST_LENGTH]; + SHA1((const unsigned char *)r->fields[1], strlen(r->fields[1]),md1_buf); + SHA1(md1_buf,SHA_DIGEST_LENGTH,md2_buf); + +#ifdef DEBUG // FIXME: remove this in future release uint8 hash_stage1[SHA_DIGEST_LENGTH]; uint8 hash_stage2[SHA_DIGEST_LENGTH]; SHA_CTX sha1_context; @@ -11150,16 +11156,11 @@ SQLite3_result* ProxySQL_Admin::__add_active_users( SHA1_Init(&sha1_context); SHA1_Update(&sha1_context,hash_stage1,SHA_DIGEST_LENGTH); SHA1_Final(hash_stage2, &sha1_context); - - unsigned char md1_buf[SHA_DIGEST_LENGTH]; - unsigned char md2_buf[SHA_DIGEST_LENGTH]; - SHA1((const unsigned char *)r->fields[1], strlen(r->fields[1]),md1_buf); assert(memcmp(md1_buf,hash_stage1,SHA_DIGEST_LENGTH)==0); - SHA1(md1_buf,SHA_DIGEST_LENGTH,md2_buf); assert(memcmp(md2_buf,hash_stage2,SHA_DIGEST_LENGTH)==0); +#endif - - password=sha1_pass_hex((char *)hash_stage2); // note that sha1_pass_hex() returns a new buffer + password=sha1_pass_hex((char *)md2_buf); // note that sha1_pass_hex() returns a new buffer } } else { password=strdup((char *)""); // we also generate a new string if hash_passwords is set diff --git a/src/proxy_tls.cpp b/src/proxy_tls.cpp index 44143b01c..d43f25f8c 100644 --- a/src/proxy_tls.cpp +++ b/src/proxy_tls.cpp @@ -1,25 +1,5 @@ -//#include -//#include #include "proxysql.h" - -//#include -//#include - #include "cpp.h" - -//#include "ProxySQL_Statistics.hpp" -//#include "MySQL_PreparedStatement.h" -//#include "ProxySQL_Cluster.hpp" -//#include "MySQL_Logger.hpp" -//#include "SQLite3_Server.h" -//#include "query_processor.h" -//#include "MySQL_Authentication.hpp" -//#include "MySQL_LDAP_Authentication.hpp" -//#include "proxysql_restapi.h" -//#include "Web_Interface.hpp" - - - #include static long