Skip to content

Commit 0fab269

Browse files
authored
fix: better time endian (#235)
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.
1 parent c40b98c commit 0fab269

2 files changed

Lines changed: 11 additions & 13 deletions

File tree

lib/source/pl/lib/std/time.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111

1212
namespace pl::lib::libstd::time {
1313

14-
static u128 packTMValue(const std::tm &tm, pl::PatternLanguage &runtime) {
15-
auto endian = runtime.getInternals().evaluator->getDefaultEndian();
14+
static u128 packTMValue(const std::tm &tm, std::endian endian = std::endian::native) {
1615
std::tm tmCopy = tm;
1716
tmCopy.tm_year = hlp::changeEndianess(tm.tm_year, 2, endian);
1817
tmCopy.tm_yday = hlp::changeEndianess(tm.tm_yday, 2, endian);
@@ -30,8 +29,7 @@ namespace pl::lib::libstd::time {
3029
return hlp::changeEndianess(result, 16, endian);
3130
}
3231

33-
static tm unpackTMValue(u128 value, pl::PatternLanguage &runtime) {
34-
auto endian = runtime.getInternals().evaluator->getDefaultEndian();
32+
static tm unpackTMValue(u128 value, std::endian endian = std::endian::native) {
3533
value = hlp::changeEndianess(value, 16, endian);
3634
tm tm = { };
3735
tm.tm_sec = (int)(value >> 0) & 0xFF;
@@ -63,48 +61,48 @@ namespace pl::lib::libstd::time {
6361
});
6462

6563
/* to_local(time) */
66-
runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
64+
runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional<Token::Literal> {
6765
auto time = time_t(params[0].toUnsigned());
6866

6967
try {
7068
auto localTime = std::localtime(&time);
7169
if (localTime == nullptr) return u128(0);
7270

73-
return { packTMValue(*localTime, runtime) };
71+
return { packTMValue(*localTime, ctx->getDefaultEndian()) };
7472
} catch (const fmt::format_error&) {
7573
return u128(0);
7674
}
7775
});
7876

7977
/* to_utc(time) */
80-
runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
78+
runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional<Token::Literal> {
8179
auto time = time_t(params[0].toUnsigned());
8280

8381
try {
8482
auto gmTime = std::gmtime(&time);
8583
if (gmTime == nullptr) return u128(0);
8684

87-
return { packTMValue(*gmTime, runtime) };
85+
return { packTMValue(*gmTime, ctx->getDefaultEndian()) };
8886
} catch (const fmt::format_error&) {
8987
return u128(0);
9088
}
9189
});
9290

9391
/* to_epoch(structured_time) */
94-
runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
92+
runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [](Evaluator *ctx, auto params) -> std::optional<Token::Literal> {
9593
u128 structuredTime = params[0].toUnsigned();
9694

97-
tm time = unpackTMValue(structuredTime, runtime);
95+
tm time = unpackTMValue(structuredTime, ctx->getDefaultEndian());
9896

9997
return { u128(std::mktime(&time)) };
10098
});
10199

102100
/* format(format_string, structured_time) */
103-
runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
101+
runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [](Evaluator *ctx, auto params) -> std::optional<Token::Literal> {
104102
auto formatString = params[0].toString(false);
105103
u128 structuredTime = params[1].toUnsigned();
106104

107-
auto time = unpackTMValue(structuredTime, runtime);
105+
auto time = unpackTMValue(structuredTime, ctx->getDefaultEndian());
108106

109107
if (time.tm_sec < 0 || time.tm_sec > 61 ||
110108
time.tm_min < 0 || time.tm_min > 59 ||

0 commit comments

Comments
 (0)