Module: kamailio
Branch: master
Commit: dc2acb895538131e99c770da6f7448cb5a46fc32
URL: 
https://github.com/kamailio/kamailio/commit/dc2acb895538131e99c770da6f7448cb5a46fc32

Author: Henning Westerholt <[email protected]>
Committer: Henning Westerholt <[email protected]>
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/dc2acb895538131e99c770da6f7448cb5a46fc32.diff
Patch: 
https://github.com/kamailio/kamailio/commit/dc2acb895538131e99c770da6f7448cb5a46fc32.patch

---

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)) {
+               ERR("Invalid time value\n");
                return -1;
        }
        strcpy(up_since_ctime, t);
-       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
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to