Merge pull request #4729 from zaydzaari/research/rtc-minute-separator-1342

fix(rtc): reject date strings ending at the minutes
This commit is contained in:
Dean 2026-10-13 15:37:15 +13:00 committed by GitHub
commit bef5f45bbc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 5 additions and 1 deletions

View File

@ -286,7 +286,7 @@ bool parseRfc2822DateTime(const char* cursor, RtcDateTime& time, std::int64_t& o
++cursor;
if (readDigits(cursor, 2, second) == 0) return false;
if (*cursor == ' ' && !parseZone(cursor + 1, offsetMinutes)) return false;
} else if (*cursor != 0 && *cursor != ' ') {
} else if (*cursor != ' ') {
return false;
}
time = makeDateTime(year, month, day, hour, minute, second, 0);

View File

@ -262,6 +262,9 @@ int main() {
{"Thu, 01 Mar 2024 12:34:56 ", 0, march, 0},
{"Thu, 01 Mar 2024 12:34:567 EST", 0, march, 0},
{"Thu, 01 Mar 2024 12:34 EST", 0, at(2024, 3, 1, 12, 34, 0), 0},
{"Thu, 29 Feb 2024 12:34", badParse, untouched, 0},
{"Thu, 01 Mar 2024 12:34", badParse, untouched, 0},
{"Thu, 29 Feb 2024 12:34 ", 0, at(2024, 2, 29, 12, 34, 0), 0},
{"Thu, 01 Mar 2024 12:34EST", badParse, untouched, 0},
{"Thu, 01 Mar 2024 1:2:3 EST", 0, at(2024, 3, 1, 1, 2, 3), -300},
{"Thu, 01 Mar 2024 26:00:00 GMT", badParse, untouched, 0},

View File

@ -3,5 +3,6 @@
### Unknown function info
- [sceRtcParseDateTime](../../../core/libs/prx/libSceRtc/Export.cpp) (libSceRtc) - the console's zone name table is only known from the names measured on PS5 firmware 13.60 and 13.42; any other name is assumed to take the military letter offset of its first character, as every measured name outside the table does (`HST`, `MSK`, `XYZ`), so a name the console's table holds but nobody measured gets the wrong offset
- [sceRtcParseDateTime](../../../core/libs/prx/libSceRtc/Export.cpp) (libSceRtc) - a blank zone after seconds is accepted. With fully allocated input storage on PS5 firmware 13.42, the same NUL-terminated text returned `BAD_PARSE` when the byte after its terminator was zero and succeeded when that byte was uppercase `T`. This dependence on storage after the terminator is not modeled; controlled backing-byte measurements on other firmware and title contexts are unavailable.
- [sceRtcFormatRFC2822, sceRtcFormatRFC2822LocalTime, sceRtcFormatRFC3339LocalTime](../../../core/libs/prx/libSceRtc/Export.cpp) (libSceRtc) - only shadPS4 (PS4) has bodies. A null tick returns `INVALID_POINTER` like the existing `sceRtcFormatRFC3339`, where shadPS4 formats the current time instead; offsets outside ±1439 minutes return `INVALID_VALUE` like `sceRtcFormatRFC3339`; the local-time variants use the host's offset at the given instant (shadPS4 uses `sceKernelGettimezone`, the current offset)
- [sceRtcGetDosTime, sceRtcSetDosTime](../../../core/libs/prx/libSceRtc/Export.cpp) (libSceRtc) - bit layout from shadPS4 (PS4, the standard FAT date/time). A year outside 1980-2107 makes `GetDosTime` return `INVALID_YEAR` after writing 0 for an earlier one and `0xff9fbf7d` (2107-12-31 23:59:58, the largest encodable time) for a later one, and `SetDosTime` decodes the year as the unsigned 7-bit FAT field (1980-2107) without validating the fields, as the disassembly-derived [fpPS4](https://github.com/red-prig/fpPS4) reimplementation of the PS4 library does; not confirmed on a PS5 title, and shadPS4 instead masks out-of-range years into the packed value and sign-extends the 16-bit date