diff --git a/server/modules/routing/schemarouter/schemarouter.c b/server/modules/routing/schemarouter/schemarouter.c index f5364155c..6173750f3 100644 --- a/server/modules/routing/schemarouter/schemarouter.c +++ b/server/modules/routing/schemarouter/schemarouter.c @@ -569,8 +569,8 @@ char* get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, query = modutil_get_SQL(buffer); if((tmp = strcasestr(query,"from"))) { - char* tok = strtok(tmp, " ;"); - tok = strtok(NULL," ;"); + char *saved, *tok = strtok_r(tmp, " ;", &saved); + tok = strtok_r(NULL, " ;", &saved); ss_dassert(tok != NULL); tmp = (char*) hashtable_fetch(ht, tok); @@ -652,49 +652,6 @@ bool check_shard_status(ROUTER_INSTANCE* router, char* shard) return rval; } -/** - * Turn a string into an array of strings. The last element in the list is a NULL - * pointer. - * @param str String to tokenize - * @return Pointer to an array of strings. - */ -char** tokenize_string(char* str) -{ - char *tok; - char **list = NULL; - int sz = 2, count = 0; - - tok = strtok(str,", "); - - if(tok == NULL) - return NULL; - - list = (char**)malloc(sizeof(char*)*(sz)); - - while(tok) - { - if(count + 1 >= sz) - { - char** tmp = realloc(list,sizeof(char*)*(sz*2)); - if(tmp == NULL) - { - char errbuf[STRERROR_BUFLEN]; - MXS_ERROR("realloc returned NULL: %s.", - strerror_r(errno, errbuf, sizeof(errbuf))); - free(list); - return NULL; - } - list = tmp; - sz *= 2; - } - list[count] = strdup(tok); - count++; - tok = strtok(NULL,", "); - } - list[count] = NULL; - return list; -} - /** * A fake DCB read function used to forward queued queries. * @param dcb Internal DCB used by the router session diff --git a/server/modules/routing/schemarouter/shardrouter.c b/server/modules/routing/schemarouter/shardrouter.c index 8b49c88d6..2ece1549b 100644 --- a/server/modules/routing/schemarouter/shardrouter.c +++ b/server/modules/routing/schemarouter/shardrouter.c @@ -482,8 +482,8 @@ get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, GWBUF* query = modutil_get_SQL(buffer); if((tmp = strcasestr(query,"from"))) { - char* tok = strtok(tmp, " ;"); - tok = strtok(NULL," ;"); + char *saved, *tok = strtok_r(tmp, " ;", &saved); + tok = strtok_r(NULL, " ;", &saved); ss_dassert(tok != NULL); tmp = (char*) hashtable_fetch(ht, tok); if(tmp) @@ -542,44 +542,6 @@ get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, GWBUF* return rval; } -char** -tokenize_string(char* str) -{ - char *tok; - char **list = NULL; - int sz = 2, count = 0; - - tok = strtok(str, ", "); - - if(tok == NULL) - return NULL; - - list = (char**) malloc(sizeof(char*)*(sz)); - - while(tok) - { - if(count + 1 >= sz) - { - char** tmp = realloc(list, sizeof(char*)*(sz * 2)); - if(tmp == NULL) - { - char errbuf[STRERROR_BUFLEN]; - MXS_ERROR("realloc returned NULL: %s.", - strerror_r(errno, errbuf, sizeof(errbuf))); - free(list); - return NULL; - } - list = tmp; - sz *= 2; - } - list[count] = strdup(tok); - count++; - tok = strtok(NULL, ", "); - } - list[count] = NULL; - return list; -} - /** * This is the function used to channel replies from a subservice up to the client. * The values passed are set in the newSession function.