From 1e5bc3778032e2d07cb7b396c2ff99b54b87dc18 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Wed, 3 Dec 2014 09:33:55 +0000 Subject: [PATCH 1/2] Use strtok_r rather than strtok --- server/core/config.c | 42 ++++++++++++++------------------ server/modules/filter/mqfilter.c | 16 ++++++------ 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/server/core/config.c b/server/core/config.c index 737781d7f..61d7a6b98 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -590,11 +590,12 @@ int error_count = 0; } if (obj->element && options) { - char *s = strtok(options, ","); + char *lasts; + char *s = strtok_r(options, ",", &lasts); while (s) { filterAddOption(obj->element, s); - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } if (obj->element) @@ -640,7 +641,8 @@ int error_count = 0; router = config_get_value(obj->parameters, "router"); if (servers && obj->element) { - char *s = strtok(servers, ","); + char *lasts; + char *s = strtok_r(servers, ",", &lasts); while (s) { CONFIG_CONTEXT *obj1 = context; @@ -667,7 +669,7 @@ int error_count = 0; "service '%s'.", s, obj->object))); } - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } else if (servers == NULL && internalService(router) == 0) @@ -681,11 +683,12 @@ int error_count = 0; } if (roptions && obj->element) { - char *s = strtok(roptions, ","); + char *lasts; + char *s = strtok_r(roptions, ",", &lasts); while (s) { serviceAddRouterOption(obj->element, s); - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } if (filters && obj->element) @@ -818,7 +821,7 @@ int error_count = 0; obj->element = monitor_alloc(obj->object, module); if (servers && obj->element) { - char *s; + char *s, *lasts; /* if id is not set, compute it now with pid only */ if (gateway.id == 0) { @@ -853,7 +856,7 @@ int error_count = 0; monitorSetNetworkTimeout(obj->element, MONITOR_WRITE_TIMEOUT, write_timeout); /* get the servers to monitor */ - s = strtok(servers, ","); + s = strtok_r(servers, ",", &lasts); while (s) { CONFIG_CONTEXT *obj1 = context; @@ -880,7 +883,7 @@ int error_count = 0; "monitor '%s'.", s, obj->object))); - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } if (obj->element && user && passwd) @@ -1529,7 +1532,8 @@ SERVER *server; filters = config_get_value(obj->parameters, "filters"); if (servers && obj->element) { - char *s = strtok(servers, ","); + char *lasts; + char *s = strtok_r(servers, ",", &lasts); while (s) { CONFIG_CONTEXT *obj1 = context; @@ -1559,17 +1563,18 @@ SERVER *server; "service '%s'.", s, obj->object))); } - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } if (roptions && obj->element) { - char *s = strtok(roptions, ","); + char *lasts; + char *s = strtok_r(roptions, ",", &lasts); serviceClearRouterOptions(obj->element); while (s) { serviceAddRouterOption(obj->element, s); - s = strtok(NULL, ","); + s = strtok_r(NULL, ",", &lasts); } } if (filters && obj->element) @@ -1667,17 +1672,6 @@ static char *service_params[] = NULL }; -static char *server_params[] = - { - "type", - "address", - "port", - "protocol", - "monitorpw", - "monitoruser", - NULL - }; - static char *listener_params[] = { "type", diff --git a/server/modules/filter/mqfilter.c b/server/modules/filter/mqfilter.c index eb69a053f..f88297e8f 100644 --- a/server/modules/filter/mqfilter.c +++ b/server/modules/filter/mqfilter.c @@ -423,8 +423,8 @@ init_conn(MQ_INSTANCE *my_instance) */ char** parse_optstr(char* str, char* tok, int* szstore) { - char* tk = str; - char** arr; + char *lasts, *tk = str; + char **arr; int i = 0, size = 1; while((tk = strpbrk(tk + 1,tok))){ size++; @@ -440,10 +440,10 @@ char** parse_optstr(char* str, char* tok, int* szstore) } *szstore = size; - tk = strtok(str,tok); + tk = strtok_r(str,tok, &lasts); while(tk && i < size){ arr[i++] = strdup(tk); - tk = strtok(NULL,tok); + tk = strtok_r(NULL,tok,&lasts); } return arr; } @@ -1052,7 +1052,8 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue) for(z = 0;zshm_trg->size; i++){ if(strcmp(tmp,my_instance->shm_trg->objects[i]) == 0){ @@ -1103,8 +1104,9 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue) char* tbnm = NULL; if((strchr(sesstbls[j],'.')) != NULL){ - tbnm = strtok(sesstbls[j],"."); - tbnm = strtok(NULL,"."); + char *lasts; + tbnm = strtok_r(sesstbls[j],".",&lasts); + tbnm = strtok_r(NULL,".",&lasts); }else{ tbnm = sesstbls[j]; } From fdb9c5e6dc41dcb8ac7f1c6ed0b2e452ff3044d2 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Wed, 3 Dec 2014 09:53:17 +0000 Subject: [PATCH 2/2] Switch to thread safe versions of localtime and asctime --- server/core/server.c | 4 +++- server/core/service.c | 17 +++++++++++------ server/core/session.c | 20 +++++++++++++++----- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/server/core/server.c b/server/core/server.c index e4cb0e114..61a3bdb3d 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -344,8 +344,10 @@ SERVER_PARAM *param; } } if (server->node_ts > 0) { + struct tm result; + char buf[40]; dcb_printf(dcb, "\tLast Repl Heartbeat:\t%s", - asctime(localtime(&server->node_ts))); + asctime_r(localtime_r((time_t *)(&server->node_ts), &result), buf)); } if ((param = server->parameters) != NULL) { diff --git a/server/core/service.c b/server/core/service.c index 708789f32..4ef101085 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -809,13 +809,16 @@ SERVICE *service; void printService(SERVICE *service) { -SERVER *ptr = service->databases; -int i; +SERVER *ptr = service->databases; +struct tm result; +char time_buf[30]; +int i; printf("Service %p\n", service); printf("\tService: %s\n", service->name); printf("\tRouter: %s (%p)\n", service->routerModule, service->router); - printf("\tStarted: %s", asctime(localtime(&service->stats.started))); + printf("\tStarted: %s", + asctime_r(localtime_r(&service->stats.started, &result), time_buf)); printf("\tBackend databases\n"); while (ptr) { @@ -887,8 +890,10 @@ SERVICE *ptr; */ void dprintService(DCB *dcb, SERVICE *service) { -SERVER *server = service->databases; -int i; +SERVER *server = service->databases; +struct tm result; +char timebuf[30]; +int i; dcb_printf(dcb, "Service %p\n", service); dcb_printf(dcb, "\tService: %s\n", @@ -898,7 +903,7 @@ int i; if (service->router) service->router->diagnostics(service->router_instance, dcb); dcb_printf(dcb, "\tStarted: %s", - asctime(localtime(&service->stats.started))); + asctime_r(localtime_r(&service->stats.started, &result), timebuf)); dcb_printf(dcb, "\tRoot user access: %s\n", service->enable_root ? "Enabled" : "Disabled"); if (service->n_filters) diff --git a/server/core/session.c b/server/core/session.c index 3369e05bd..031780012 100644 --- a/server/core/session.c +++ b/server/core/session.c @@ -465,11 +465,15 @@ int rval = 0; void printSession(SESSION *session) { +struct tm result; +char timebuf[40]; + printf("Session %p\n", session); printf("\tState: %s\n", session_state(session->state)); printf("\tService: %s (%p)\n", session->service->name, session->service); printf("\tClient DCB: %p\n", session->client); - printf("\tConnected: %s", asctime(localtime(&session->stats.connect))); + printf("\tConnected: %s", + asctime_r(localtime_r(&session->stats.connect, &result), timebuf)); } /** @@ -566,7 +570,9 @@ int norouter = 0; void dprintAllSessions(DCB *dcb) { -SESSION *ptr; +struct tm result; +char timebuf[40]; +SESSION *ptr; spinlock_acquire(&session_spin); ptr = allSessions; @@ -578,7 +584,8 @@ SESSION *ptr; dcb_printf(dcb, "\tClient DCB: %p\n", ptr->client); if (ptr->client && ptr->client->remote) dcb_printf(dcb, "\tClient Address: %s\n", ptr->client->remote); - dcb_printf(dcb, "\tConnected: %s", asctime(localtime(&ptr->stats.connect))); + dcb_printf(dcb, "\tConnected: %s", + asctime_r(localtime_r(&ptr->stats.connect, &result), timebuf)); ptr = ptr->next; } spinlock_release(&session_spin); @@ -596,7 +603,9 @@ SESSION *ptr; void dprintSession(DCB *dcb, SESSION *ptr) { -int i; +struct tm result; +char buf[30]; +int i; dcb_printf(dcb, "Session %d (%p)\n",ptr->ses_id, ptr); dcb_printf(dcb, "\tState: %s\n", session_state(ptr->state)); @@ -604,7 +613,8 @@ int i; dcb_printf(dcb, "\tClient DCB: %p\n", ptr->client); if (ptr->client && ptr->client->remote) dcb_printf(dcb, "\tClient Address: %s\n", ptr->client->remote); - dcb_printf(dcb, "\tConnected: %s", asctime(localtime(&ptr->stats.connect))); + dcb_printf(dcb, "\tConnected: %s", + asctime_r(localtime_r(&ptr->stats.connect, &result), buf)); if (ptr->n_filters) { for (i = 0; i < ptr->n_filters; i++)