1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 18:53:28 +01:00

cellRtc: Fix some param checks

This commit is contained in:
Megamouse 2022-10-15 15:22:36 +02:00
parent 419e673d5b
commit fafae1cbb5
2 changed files with 26 additions and 22 deletions

View File

@ -7,9 +7,6 @@
#include "Emu/Cell/lv2/sys_memory.h" #include "Emu/Cell/lv2/sys_memory.h"
#include "Emu/Cell/lv2/sys_ss.h" #include "Emu/Cell/lv2/sys_ss.h"
//#include <iomanip>
//#include <sstream>
LOG_CHANNEL(cellRtc); LOG_CHANNEL(cellRtc);
// clang-format off // clang-format off
@ -43,16 +40,16 @@ void fmt_class_string<CellRtcError>::format(std::string& out, u64 arg)
// Grabbed from JPCSP // Grabbed from JPCSP
// This is the # of microseconds between January 1, 0001 and January 1, 1970. // This is the # of microseconds between January 1, 0001 and January 1, 1970.
const u64 RTC_MAGIC_OFFSET = 62135596800000000ULL; constexpr u64 RTC_MAGIC_OFFSET = 62135596800000000ULL;
// This is the # of microseconds between January 1, 0001 and January 1, 1601 (for Win32 FILETIME.) // This is the # of microseconds between January 1, 0001 and January 1, 1601 (for Win32 FILETIME.)
const u64 RTC_FILETIME_OFFSET = 50491123200000000ULL; constexpr u64 RTC_FILETIME_OFFSET = 50491123200000000ULL;
const u64 EPOCH_AS_FILETIME = 116444736000000000ULL; constexpr u64 EPOCH_AS_FILETIME = 116444736000000000ULL;
// Also stores leap year // Also stores leap year
const u8 DAYS_IN_MONTH[24] = {0x1F, 0x1C, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1D, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F}; constexpr u8 DAYS_IN_MONTH[24] = {0x1F, 0x1C, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1D, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1E, 0x1F, 0x1E, 0x1F};
const char WEEKDAY_NAMES[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 4 as terminator constexpr char WEEKDAY_NAMES[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 4 as terminator
const char MONTH_NAMES[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; // 4 as terminator constexpr char MONTH_NAMES[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; // 4 as terminator
s64 convertToUNIXTime(u16 seconds, u16 minutes, u16 hours, u16 days, s32 years) s64 convertToUNIXTime(u16 seconds, u16 minutes, u16 hours, u16 days, s32 years)
{ {
@ -122,7 +119,7 @@ error_code cellRtcGetCurrentTick(vm::ptr<CellRtcTick> pTick)
error_code cellRtcGetCurrentClock(vm::ptr<CellRtcDateTime> pClock, s32 iTimeZone) error_code cellRtcGetCurrentClock(vm::ptr<CellRtcDateTime> pClock, s32 iTimeZone)
{ {
cellRtc.todo("cellRtcGetCurrentClock(pClock=*0x%x, time_zone=%d)", pClock, iTimeZone); cellRtc.todo("cellRtcGetCurrentClock(pClock=*0x%x, iTimeZone=%d)", pClock, iTimeZone);
if (!vm::check_addr(pClock.addr())) if (!vm::check_addr(pClock.addr()))
{ {
@ -1131,6 +1128,13 @@ error_code cellRtcGetCurrentSecureTick(vm::ptr<CellRtcTick> tick)
{ {
cellRtc.todo("cellRtcGetCurrentSecureTick(*0x%x)", tick); cellRtc.todo("cellRtcGetCurrentSecureTick(*0x%x)", tick);
if (!vm::check_addr(tick.addr()))
{
return CELL_RTC_ERROR_INVALID_POINTER;
}
// TODO
return CELL_OK; return CELL_OK;
} }
@ -1445,7 +1449,7 @@ error_code cellRtcIsLeapYear(s32 year)
{ {
cellRtc.todo("cellRtcIsLeapYear(year=%d)", year); cellRtc.todo("cellRtcIsLeapYear(year=%d)", year);
if (year < 0) if (year < 1)
{ {
return CELL_RTC_ERROR_INVALID_ARG; return CELL_RTC_ERROR_INVALID_ARG;
} }
@ -1457,7 +1461,7 @@ error_code cellRtcGetDaysInMonth(s32 year, s32 month)
{ {
cellRtc.todo("cellRtcGetDaysInMonth(year=%d, month=%d)", year, month); cellRtc.todo("cellRtcGetDaysInMonth(year=%d, month=%d)", year, month);
if ((year < 0) || (month <= 0) || (month > 12)) if ((year <= 0) || (month <= 0) || (month > 12))
{ {
return CELL_RTC_ERROR_INVALID_ARG; return CELL_RTC_ERROR_INVALID_ARG;
} }
@ -1474,10 +1478,10 @@ error_code cellRtcGetDayOfWeek(s32 year, s32 month, s32 day)
{ {
cellRtc.trace("cellRtcGetDayOfWeek(year=%d, month=%d, day=%d)", year, month, day); cellRtc.trace("cellRtcGetDayOfWeek(year=%d, month=%d, day=%d)", year, month, day);
if (month - 1 < 2) if (month == 1 || month == 2)
{ {
year -= 1; year--;
month += 0xc; month += 12;
} }
return not_an_error(((month * 0xd + 8) / 5 + ((year + (year >> 2) + (year < 0 && (year & 3U) != 0)) - year / 100) + year / 400 + day) % 7); return not_an_error(((month * 0xd + 8) / 5 + ((year + (year >> 2) + (year < 0 && (year & 3U) != 0)) - year / 100) + year / 400 + day) % 7);

View File

@ -29,13 +29,13 @@ struct CellRtcTick
struct CellRtcDateTime struct CellRtcDateTime
{ {
be_t<u16> year; be_t<u16> year; // 1 to 9999
be_t<u16> month; be_t<u16> month; // 1 to 12
be_t<u16> day; be_t<u16> day; // 1 to 31
be_t<u16> hour; be_t<u16> hour; // 0 to 23
be_t<u16> minute; be_t<u16> minute; // 0 to 59
be_t<u16> second; be_t<u16> second; // 0 to 59
be_t<u32> microsecond; be_t<u32> microsecond; // 0 to 999999
}; };
error_code cellRtcTickAddYears(vm::ptr<CellRtcTick> pTick0, vm::cptr<CellRtcTick> pTick1, s32 iAdd); error_code cellRtcTickAddYears(vm::ptr<CellRtcTick> pTick0, vm::cptr<CellRtcTick> pTick1, s32 iAdd);