Merge pull request #3855 from Lorkydey/fix/libkernel-utc-dst-width

fix(libkernel): limit UTC-to-local DST output to 32 bits
This commit is contained in:
Dean 2026-10-12 16:07:49 +13:00 committed by GitHub
commit f3abf38307
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 5 deletions

View File

@ -580,7 +580,7 @@ int APS5_VABI sceKernelConvertLocaltimeToUtc(int64_t local_time, int64_t reserve
return 0;
}
int APS5_VABI sceKernelConvertUtcToLocaltime(int64_t utc_time, int64_t* local_time, KernelTimesec* st, uint64_t* dst_sec) {
int APS5_VABI sceKernelConvertUtcToLocaltime(int64_t utc_time, int64_t* local_time, KernelTimesec* st, int32_t* dst_sec) {
if (local_time != nullptr) *local_time = utc_time;
if (st != nullptr) *st = {utc_time, 0u, 0u};
if (dst_sec != nullptr) *dst_sec = 0;

View File

@ -16,7 +16,7 @@ int APS5_VABI sceKernelUsleep_nid_postfix(KernelUseconds microseconds);
int APS5_VABI gettimeofday_nid_postfix(KernelTimeval* tv, KernelTimezone* tz);
std::int64_t APS5_VABI _Xtime_get_ticks_nid_postfix();
int APS5_VABI sceKernelConvertLocaltimeToUtc(std::int64_t, std::int64_t, std::int64_t*, KernelTimesec*, std::int32_t*);
int APS5_VABI sceKernelConvertUtcToLocaltime(std::int64_t, std::int64_t*, KernelTimesec*, std::uint64_t*);
int APS5_VABI sceKernelConvertUtcToLocaltime(std::int64_t, std::int64_t*, KernelTimesec*, std::int32_t*);
}
static constexpr int SCE_OK = 0;
@ -179,6 +179,11 @@ static void CalendarConversionsInitializeTheirState() {
KernelTimesec state;
std::uint64_t after;
};
struct GuardedDst {
std::int32_t seconds;
std::uint32_t after;
};
static_assert(sizeof(GuardedDst) == 8);
for (const auto seconds : std::array<std::int64_t, 4>{-86400, 0, 1767225600, 2147483648}) {
GuardedState local{sentinel, {-1, 0xa5a5a5a5u, 0xa5a5a5a5u}, sentinel};
std::int64_t utc = -1;
@ -189,9 +194,10 @@ static void CalendarConversionsInitializeTheirState() {
Require(local.before == sentinel && local.after == sentinel);
GuardedState universal{sentinel, {-1, 0xa5a5a5a5u, 0xa5a5a5a5u}, sentinel};
std::int64_t converted = -1;
std::uint64_t universalDst = sentinel;
Require(sceKernelConvertUtcToLocaltime(utc, &converted, &universal.state, &universalDst) == SCE_OK);
Require(converted == seconds && universalDst == 0);
GuardedDst universalDst{-1, 0xa5a5a5a5u};
Require(sceKernelConvertUtcToLocaltime(utc, &converted, &universal.state, &universalDst.seconds) == SCE_OK);
Require(converted == seconds && universalDst.seconds == 0);
Require(universalDst.after == 0xa5a5a5a5u);
Require(universal.state.t == seconds && universal.state.west_sec == 0 && universal.state.dst_sec == 0);
Require(universal.before == sentinel && universal.after == sentinel);
}