Fix crash in importwallet and dumpwallet formatting

- DecodeDumpTime was passing a statically allocated facet object to
  std::locale. However, "The constructed locale object takes over
  responsibility for deleting this facet object." causing a free()
  crash on scope exit. Fixes #3670.

- EncodeDumpTime was using the wrong format character for dates
  (appears accidentally introduced in 51ed9ec9)
This commit is contained in:
Wladimir J. van der Laan 2014-02-17 11:32:43 +01:00
parent 129429dd8f
commit a143d4ce58

View file

@ -23,13 +23,13 @@ using namespace std;
void EnsureWalletIsUnlocked(); void EnsureWalletIsUnlocked();
std::string static EncodeDumpTime(int64_t nTime) { std::string static EncodeDumpTime(int64_t nTime) {
return DateTimeStrFormat("%Y-%m-%"PRId64"T%H:%M:%SZ", nTime); return DateTimeStrFormat("%Y-%m-%dT%H:%M:%SZ", nTime);
} }
int64_t static DecodeDumpTime(const std::string &str) { int64_t static DecodeDumpTime(const std::string &str) {
static boost::posix_time::time_input_facet facet("%Y-%m-%dT%H:%M:%SZ");
static const boost::posix_time::ptime epoch = boost::posix_time::from_time_t(0); static const boost::posix_time::ptime epoch = boost::posix_time::from_time_t(0);
const std::locale loc(std::locale::classic(), &facet); static const std::locale loc(std::locale::classic(),
new boost::posix_time::time_input_facet("%Y-%m-%dT%H:%M:%SZ"));
std::istringstream iss(str); std::istringstream iss(str);
iss.imbue(loc); iss.imbue(loc);
boost::posix_time::ptime ptime(boost::date_time::not_a_date_time); boost::posix_time::ptime ptime(boost::date_time::not_a_date_time);