Replace localtime() with thread safe localtime_r()
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 17 Oct 2011 09:40:18 +0000 (11:40 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 17 Oct 2011 09:40:18 +0000 (11:40 +0200)
src/logfunc.cpp
src/timefunc.cpp
test/test_timefunc.cpp

index dc49388..115bf03 100644 (file)
@@ -231,7 +231,11 @@ void log_msg( int level, const std::string& msg)
             {
                 time_t t = time(NULL);
                 char buffer[32];
-                std::strftime(buffer, sizeof(buffer),"%b %d %H:%M:%S ", std::localtime(&t));
+                struct tm ta;
+                if (localtime_r(&t, &ta) == NULL)
+                    memset(&ta, 0, sizeof(struct tm));
+
+                std::strftime(buffer, sizeof(buffer),"%b %d %H:%M:%S ", &ta);
                 ostr << buffer;
             }
             ostr << get_level_tag(level) << " ";
index a45f00e..ab5f6dc 100644 (file)
@@ -133,9 +133,11 @@ string format_full_time(int seconds)
 {
     char buf[50];
     memset (buf, 0, 50);
-    struct tm *ta = localtime ((time_t *)&seconds);
+    struct tm ta;
+    if (localtime_r((time_t *)&seconds, &ta) == NULL)
+        memset (&ta, 0, sizeof(struct tm));
 
-    strftime (buf, 49, "%d.%m.%Y %H:%M", ta);
+    strftime (buf, 49, "%d.%m.%Y %H:%M", &ta);
     return string(buf);
 }
 
index 4a2a04e..f4bc4f2 100644 (file)
@@ -442,4 +442,11 @@ BOOST_AUTO_TEST_CASE(WeekDisplayString13)
     BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
 }
 
+BOOST_AUTO_TEST_CASE(FormatFullTime)
+{
+    time_t seconds = 1318844005;
+
+    BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
+}
+
 BOOST_AUTO_TEST_SUITE_END()