Skip to content

Commit

Permalink
Replace non-threadsafe gmtime and setlocale
Browse files Browse the repository at this point in the history
Make DateTimeStrFormat use boost::posix_time.

Also re-enable the util_DateTimeStrFormat tests, as they are no
longer platform specific.
  • Loading branch information
laanwj committed May 23, 2014
1 parent a60838d commit 3e8ac6a
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 20 deletions.
10 changes: 1 addition & 9 deletions src/rpcprotocol.cpp
Expand Up @@ -51,15 +51,7 @@ string HTTPPost(const string& strMsg, const map<string,string>& mapRequestHeader

static string rfc1123Time()
{
char buffer[64];
time_t now;
time(&now);
struct tm* now_gmt = gmtime(&now);
string locale(setlocale(LC_TIME, NULL));
setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings
strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt);
setlocale(LC_TIME, locale.c_str());
return string(buffer);
return DateTimeStrFormat("%a, %d %b %Y %H:%M:%S +0000", GetTime());
}

string HTTPReply(int nStatus, const string& strMsg, bool keepalive)
Expand Down
4 changes: 1 addition & 3 deletions src/test/util_tests.cpp
Expand Up @@ -108,13 +108,11 @@ BOOST_AUTO_TEST_CASE(util_HexStr)

BOOST_AUTO_TEST_CASE(util_DateTimeStrFormat)
{
/*These are platform-dependant and thus removed to avoid useless test failures
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 0), "1970-01-01 00:00:00");
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 0x7FFFFFFF), "2038-01-19 03:14:07");
// Formats used within Bitcoin
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M:%S", 1317425777), "2011-09-30 23:36:17");
BOOST_CHECK_EQUAL(DateTimeStrFormat("%Y-%m-%d %H:%M", 1317425777), "2011-09-30 23:36");
*/
BOOST_CHECK_EQUAL(DateTimeStrFormat("%a, %d %b %Y %H:%M:%S +0000", 1317425777), "Fri, 30 Sep 2011 23:36:17 +0000");
}

BOOST_AUTO_TEST_CASE(util_ParseParameters)
Expand Down
12 changes: 12 additions & 0 deletions src/util.cpp
Expand Up @@ -14,6 +14,8 @@

#include <stdarg.h>

#include <boost/date_time/posix_time/posix_time.hpp>

#ifndef WIN32
// for posix_fallocate
#ifdef __linux_
Expand Down Expand Up @@ -1400,3 +1402,13 @@ void SetupEnvironment()
}
#endif
}

std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime)
{
// std::locale takes ownership of the pointer
std::locale loc(std::locale::classic(), new boost::posix_time::time_facet(pszFormat));
std::stringstream ss;
ss.imbue(loc);
ss << boost::posix_time::from_time_t(nTime);
return ss.str();
}
9 changes: 1 addition & 8 deletions src/util.h
Expand Up @@ -325,14 +325,7 @@ inline int64_t GetTimeMicros()
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds();
}

inline std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime)
{
time_t n = nTime;
struct tm* ptmTime = gmtime(&n);
char pszTime[200];
strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime);
return pszTime;
}
std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime);

inline bool IsSwitchChar(char c)
{
Expand Down

0 comments on commit 3e8ac6a

Please sign in to comment.