Fixed thread safety issues in schemarouter and shardrouter
Fixed strtok being used in a multithreaded context and removed unused code.
This commit is contained in:
parent
3abcb52837
commit
05a7f5759b
@ -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
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user