From 8103256c5cfcf398ffb7da95bd17f8110fb42fc5 Mon Sep 17 00:00:00 2001 From: paxcut Date: Thu, 30 Apr 2026 13:44:28 -0700 Subject: [PATCH] The packing and unpacking time functions using a pointer to runtime could end up with invalid pointers. A more robust approach is to use the evaluator context to obtain the endian value and pass ot instead to the packing time functions. Also updated the libwolv version to the latest master. --- external/libwolv | 2 +- lib/source/pl/lib/std/time.cpp | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/external/libwolv b/external/libwolv index 1063613e..05b2db4c 160000 --- a/external/libwolv +++ b/external/libwolv @@ -1 +1 @@ -Subproject commit 1063613e87100910dfae254ae9af0111203c768b +Subproject commit 05b2db4c301574af0f7a10c740aaa39a73579946 diff --git a/lib/source/pl/lib/std/time.cpp b/lib/source/pl/lib/std/time.cpp index 11a05b70..6db56652 100644 --- a/lib/source/pl/lib/std/time.cpp +++ b/lib/source/pl/lib/std/time.cpp @@ -11,8 +11,7 @@ namespace pl::lib::libstd::time { - static u128 packTMValue(const std::tm &tm, pl::PatternLanguage &runtime) { - auto endian = runtime.getInternals().evaluator->getDefaultEndian(); + static u128 packTMValue(const std::tm &tm, std::endian endian = std::endian::native) { std::tm tmCopy = tm; tmCopy.tm_year = hlp::changeEndianess(tm.tm_year, 2, endian); tmCopy.tm_yday = hlp::changeEndianess(tm.tm_yday, 2, endian); @@ -30,8 +29,7 @@ namespace pl::lib::libstd::time { return hlp::changeEndianess(result, 16, endian); } - static tm unpackTMValue(u128 value, pl::PatternLanguage &runtime) { - auto endian = runtime.getInternals().evaluator->getDefaultEndian(); + static tm unpackTMValue(u128 value, std::endian endian = std::endian::native) { value = hlp::changeEndianess(value, 16, endian); tm tm = { }; tm.tm_sec = (int)(value >> 0) & 0xFF; @@ -63,48 +61,48 @@ namespace pl::lib::libstd::time { }); /* to_local(time) */ - runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional { + runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional { auto time = time_t(params[0].toUnsigned()); try { auto localTime = std::localtime(&time); if (localTime == nullptr) return u128(0); - return { packTMValue(*localTime, runtime) }; + return { packTMValue(*localTime, ctx->getDefaultEndian()) }; } catch (const fmt::format_error&) { return u128(0); } }); /* to_utc(time) */ - runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional { + runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional { auto time = time_t(params[0].toUnsigned()); try { auto gmTime = std::gmtime(&time); if (gmTime == nullptr) return u128(0); - return { packTMValue(*gmTime, runtime) }; + return { packTMValue(*gmTime, ctx->getDefaultEndian()) }; } catch (const fmt::format_error&) { return u128(0); } }); /* to_epoch(structured_time) */ - runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional { + runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional { u128 structuredTime = params[0].toUnsigned(); - tm time = unpackTMValue(structuredTime, runtime); + tm time = unpackTMValue(structuredTime, ctx->getDefaultEndian()); return { u128(std::mktime(&time)) }; }); /* format(format_string, structured_time) */ - runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [&runtime](Evaluator *, auto params) -> std::optional { + runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [](Evaluator *ctx, auto params) -> std::optional { auto formatString = params[0].toString(false); u128 structuredTime = params[1].toUnsigned(); - auto time = unpackTMValue(structuredTime, runtime); + auto time = unpackTMValue(structuredTime, ctx->getDefaultEndian()); if (time.tm_sec < 0 || time.tm_sec > 61 || time.tm_min < 0 || time.tm_min > 59 ||