From 36d37a062a7a720f17df8edfcb509659e7e9430e Mon Sep 17 00:00:00 2001 From: Lorkydey <57268822+Lorkydey@users.noreply.github.com> Date: Sun, 11 Oct 2026 19:56:47 +0200 Subject: [PATCH] fix(libkernel): limit UTC-to-local DST output to 32 bits --- core/libs/prx/libkernel/Time/Time.cpp | 2 +- core/libs/tests/GuestFreebsdClocks.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/libs/prx/libkernel/Time/Time.cpp b/core/libs/prx/libkernel/Time/Time.cpp index 581e81bb5..9e7336ea7 100644 --- a/core/libs/prx/libkernel/Time/Time.cpp +++ b/core/libs/prx/libkernel/Time/Time.cpp @@ -581,7 +581,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; diff --git a/core/libs/tests/GuestFreebsdClocks.cpp b/core/libs/tests/GuestFreebsdClocks.cpp index be5f30434..e5ba4c678 100644 --- a/core/libs/tests/GuestFreebsdClocks.cpp +++ b/core/libs/tests/GuestFreebsdClocks.cpp @@ -12,7 +12,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; @@ -147,6 +147,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{-86400, 0, 1767225600, 2147483648}) { GuardedState local{sentinel, {-1, 0xa5a5a5a5u, 0xa5a5a5a5u}, sentinel}; std::int64_t utc = -1; @@ -157,9 +162,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); }