# From: Myself and (mostly) WerWolv # Fixes https://github.com/WerWolv/ImHex/issues/2225 --- a/lib/external/pattern_language/lib/source/pl/lib/std/time.cpp +++ b/lib/external/pattern_language/lib/source/pl/lib/std/time.cpp @@ -11,7 +11,7 @@ namespace pl::lib::libstd::time { - static u128 packTMValue(std::tm tm) { + static u128 packTMValue(const std::tm &tm) { return (u128(tm.tm_sec) << 0) | (u128(tm.tm_min) << 8) | @@ -57,9 +57,10 @@ namespace pl::lib::libstd::time { auto time = time_t(params[0].toUnsigned()); try { - auto localTime = fmt::localtime(time); + auto localTime = std::localtime(&time); + if (localTime == nullptr) return u128(0); - return { packTMValue(localTime) }; + return { packTMValue(*localTime) }; } catch (const fmt::format_error&) { return u128(0); } @@ -70,9 +71,10 @@ namespace pl::lib::libstd::time { auto time = time_t(params[0].toUnsigned()); try { - auto gmTime = fmt::gmtime(time); + auto gmTime = std::gmtime(&time); + if (gmTime == nullptr) return u128(0); - return { packTMValue(gmTime) }; + return { packTMValue(*gmTime) }; } catch (const fmt::format_error&) { return u128(0); } --- a/lib/libimhex/source/helpers/logger.cpp +++ b/lib/libimhex/source/helpers/logger.cpp @@ -83,7 +83,8 @@ namespace hex::log { for (const auto &path : paths::Logs.all()) { wolv::io::fs::createDirectories(path); - s_loggerFile = wolv::io::File(path / hex::format("{0:%Y%m%d_%H%M%S}.log", fmt::localtime(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()))), wolv::io::File::Mode::Create); + time_t time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + s_loggerFile = wolv::io::File(path / hex::format("{0:%Y%m%d_%H%M%S}.log", *std::localtime(&time)), wolv::io::File::Mode::Create); s_loggerFile.disableBuffering(); if (s_loggerFile.isValid()) { @@ -120,7 +121,8 @@ namespace hex::log { void printPrefix(FILE *dest, const fmt::text_style &ts, const std::string &level, const char *projectName) { - const auto now = fmt::localtime(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())); + const auto time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + const auto now = *std::localtime(&time); fmt::print(dest, "[{0:%H:%M:%S}] ", now); --- a/main/gui/source/init/splash_window.cpp +++ b/main/gui/source/init/splash_window.cpp @@ -111,7 +111,7 @@ namespace hex::init { const auto now = std::chrono::system_clock::now(); const auto time = std::chrono::system_clock::to_time_t(now); - return fmt::localtime(time); + return *std::localtime(&time); }(); for (const auto &colorConfig : highlightConfig) { --- a/plugins/builtin/source/content/data_inspector.cpp +++ b/plugins/builtin/source/content/data_inspector.cpp @@ -621,11 +621,16 @@ namespace hex::plugin::builtin { ContentRegistry::DataInspector::add("hex.builtin.inspector.time32", sizeof(u32), [](auto buffer, auto endian, auto style) { std::ignore = style; - auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); + time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); std::string value; try { - value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime)); + auto time = std::localtime(&endianAdjustedTime); + if (time == nullptr) { + value = "Invalid"; + } else { + value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time); + } } catch (fmt::format_error &) { value = "Invalid"; } @@ -636,11 +641,16 @@ namespace hex::plugin::builtin { ContentRegistry::DataInspector::add("hex.builtin.inspector.time64", sizeof(u64), [](auto buffer, auto endian, auto style) { std::ignore = style; - auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); + time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); std::string value; try { - value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime)); + auto time = std::localtime(&endianAdjustedTime); + if (time == nullptr) { + value = "Invalid"; + } else { + value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time); + } } catch (fmt::format_error &) { value = "Invalid"; } @@ -653,11 +663,16 @@ namespace hex::plugin::builtin { ContentRegistry::DataInspector::add("hex.builtin.inspector.time", sizeof(time_t), [](auto buffer, auto endian, auto style) { std::ignore = style; - auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); + time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast(buffer.data()), endian); std::string value; try { - value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime)); + auto time = std::localtime(&endianAdjustedTime); + if (time == nullptr) { + value = "Invalid"; + } else { + value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time); + } } catch (fmt::format_error &e) { value = "Invalid"; } --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -135,14 +135,14 @@ namespace hex::plugin::builtin { if (m_fileStats.has_value()) { std::string creationTime, accessTime, modificationTime; - try { creationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_ctime)); } - catch (const std::exception&) { creationTime = "???"; } + try { creationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_ctime)); } + catch (const fmt::format_error&) { creationTime = "???"; } - try { accessTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_atime)); } - catch (const std::exception&) { accessTime = "???"; } + try { accessTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_atime)); } + catch (const fmt::format_error&) { accessTime = "???"; } - try { modificationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_mtime)); } - catch (const std::exception&) { modificationTime = "???"; } + try { modificationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_mtime)); } + catch (const fmt::format_error&) { modificationTime = "???"; } result.emplace_back("hex.builtin.provider.file.creation"_lang, creationTime); result.emplace_back("hex.builtin.provider.file.access"_lang, accessTime);