Hello,
were these changes to use ctime_r() (and in other commits gmtime_r(), localtime_r(), asctime_r()) required to fix existing issues or more like a preference to use them? Because Kamailio is multiprocess and thread safety should not be a concern, otherwise there might be a lot of other place to take care of thread safety...
Anyhow, there are out of bound writes introduced as the buffers must be at least 26 chars long, not 25 -- those need to be fixed.
Cheers, Daniel
On 20.09.19 00:04, Henning Westerholt wrote:
Module: kamailio Branch: master Commit: dc2acb895538131e99c770da6f7448cb5a46fc32 URL: https://github.com/kamailio/kamailio/commit/dc2acb895538131e99c770da6f7448cb...
Author: Henning Westerholt hw@skalatan.de Committer: Henning Westerholt hw@skalatan.de Date: 2019-09-19T23:49:32+02:00
core: replace glibc time function calls with the thread-safe versions
- replace glibc time function calls with the thread-safe versions, to prevent race conditions from multi-process / multi-threaded access
- used in 'kamcmd core.uptime' rpc cmd, no functional change, locally tested
Modified: src/core/core_cmd.c
Diff: https://github.com/kamailio/kamailio/commit/dc2acb895538131e99c770da6f7448cb... Patch: https://github.com/kamailio/kamailio/commit/dc2acb895538131e99c770da6f7448cb...
diff --git a/src/core/core_cmd.c b/src/core/core_cmd.c index 5b1c4624ed..717e240fde 100644 --- a/src/core/core_cmd.c +++ b/src/core/core_cmd.c @@ -224,8 +224,7 @@ static const char* dst_blst_stats_get_doc[] = { #endif
-#define MAX_CTIME_LEN 128 +#define MAX_CTIME_LEN 25
/* up time */ static char up_since_ctime[MAX_CTIME_LEN]; @@ -381,13 +380,14 @@ static void core_uptime(rpc_t* rpc, void* c) { void* s; time_t now;
char buf[MAX_CTIME_LEN]; str snow;
snow.s = buf;
time(&now);
if (rpc->add(c, "{", &s) < 0) return;
- snow.s = ctime(&now);
- if(snow.s) {
- if(ctime_r(&now, snow.s)) { snow.len = strlen(snow.s); if(snow.len>2 && snow.s[snow.len-1]=='\n') snow.len--; rpc->struct_add(s, "S", "now", &snow);
@@ -1187,21 +1187,14 @@ int register_core_rpcs(void)
int rpc_init_time(void) {
- char *t;
- t=ctime(&up_since);
- if (strlen(t)+1>=MAX_CTIME_LEN) {
ERR("Too long data %d\n", (int)strlen(t));
- char t[MAX_CTIME_LEN];
- int len;
- if (! ctime_r(&up_since, t)) {
return -1; } strcpy(up_since_ctime, t);ERR("Invalid time value\n");
- t = up_since_ctime + strlen(up_since_ctime);
- while(t>up_since_ctime) {
if(*t=='\0' || *t=='\r' || *t=='\n') {
*t = '\0';
} else {
break;
}
t--;
- }
- len = strlen(up_since_ctime);
- if(len>2 && up_since_ctime[len-1]=='\n') up_since_ctime[len-1]='\0'; return 0;
}
Kamailio (SER) - Development Mailing List sr-dev@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev