[sr-dev] git:master:dc2acb89: core: replace glibc time function calls with the thread-safe versions

Henning Westerholt hw at skalatan.de
Fri Sep 20 00:04:56 CEST 2019


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

Author: Henning Westerholt <hw at skalatan.de>
Committer: Henning Westerholt <hw at 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/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;
 }




More information about the sr-dev mailing list