diff --git a/include/gen_utils.h b/include/gen_utils.h index cf7cddfa9..ca16ebe05 100644 --- a/include/gen_utils.h +++ b/include/gen_utils.h @@ -160,3 +160,4 @@ bool Proxy_file_regular(const char *); int remove_spaces(const char *); char *trim_spaces_in_place(char *str); +char *trim_spaces_and_quotes_in_place(char *str); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 3b20f056e..5e481dace 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -529,8 +529,9 @@ bool MySQL_Session::handler_special_queries(PtrSize_t *pkt) { l_free(pkt->size,pkt->ptr); return true; } - if ( (pkt->size < 25) && (pkt->size > 15) && (strncasecmp((char *)"SET NAMES ",(char *)pkt->ptr+5,10)==0) ) { - char *name=strndup((char *)pkt->ptr+15,pkt->size-15); + if ( (pkt->size < 35) && (pkt->size > 15) && (strncasecmp((char *)"SET NAMES ",(char *)pkt->ptr+5,10)==0) ) { + char *unstripped=strndup((char *)pkt->ptr+15,pkt->size-15); + char *name=trim_spaces_and_quotes_in_place(unstripped); const CHARSET_INFO * c = proxysql_find_charset_name(name); client_myds->DSS=STATE_QUERY_SENT_NET; if (!c) { @@ -549,7 +550,7 @@ bool MySQL_Session::handler_special_queries(PtrSize_t *pkt) { client_myds->DSS=STATE_SLEEP; status=WAITING_CLIENT_DATA; l_free(pkt->size,pkt->ptr); - free(name); + free(unstripped); return true; } diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index bdc1ffa3f..fd09f92c2 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -531,7 +531,7 @@ bool admin_handler_command_set(char *query_no_space, unsigned int query_no_space *ql = strlen(*q) + 1; } } - free(var_name); + free(untrimmed_var_name); free(var_value); return run_query; } diff --git a/lib/gen_utils.cpp b/lib/gen_utils.cpp index 770ac5a9b..47e4d5256 100644 --- a/lib/gen_utils.cpp +++ b/lib/gen_utils.cpp @@ -60,6 +60,22 @@ char *trim_spaces_in_place(char *str) return str; } + +char *trim_spaces_and_quotes_in_place(char *str) { + char *end; + // Trim leading space + while(isspace(*str) || *str=='\"' || *str=='\'') + str++; + if(*str == 0) // All spaces? + return str; + // Trim trailing space + end = str + strlen(str) - 1; + while(end > str && (isspace(*end) || *end=='\"' || *end=='\'')) end--; + // Write new null terminator + *(end+1) = 0; + return str; +} + #define MIN_ARRAY_LEN 8 #define MIN_ARRAY_DELETE_RATIO 8