From 3fee9d12acfe2ff8259b32d6abbe15456c9566fd Mon Sep 17 00:00:00 2001 From: StoneDC <19905433+StoneDC@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:37:35 +0800 Subject: [PATCH] fix(libSceDiscId): report no disc without assuming an argument contract The previous revision rejected a null output with 0x80D50001 and any nonzero flag with 0x80D50002, but no SDK or console evidence establishes those validation rules, the error codes or their precedence, and the flag argument may be a bitfield. Report SCE_DISC_ID_ERROR_NO_DISC for every pointer and flag value without touching the output, and record the unverified contract in the debt entry. Normalize the new test and CMake file to LF line endings. --- core/libs/prx/libSceDiscId/CMakeLists.txt | 28 ++++---- core/libs/tests/GuestDiscId.cpp | 84 +++++++++++------------ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/core/libs/prx/libSceDiscId/CMakeLists.txt b/core/libs/prx/libSceDiscId/CMakeLists.txt index 04082fe8da..89774ced7b 100644 --- a/core/libs/prx/libSceDiscId/CMakeLists.txt +++ b/core/libs/prx/libSceDiscId/CMakeLists.txt @@ -1,14 +1,14 @@ -add_library(libSceDiscId SHARED EXCLUDE_FROM_ALL Export.cpp) -target_include_directories(libSceDiscId PRIVATE ${LIBS_INCLUDE_DIR}) -configure_windows_unwind(libSceDiscId) - -if(BUILD_TESTING) - add_test_executable(guest_disc_id_tests ${LIBS_INCLUDE_DIR}/tests/GuestDiscId.cpp) - target_include_directories(guest_disc_id_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_disc_id_tests PRIVATE libSceDiscId libc) - add_test(NAME guest_disc_id COMMAND guest_disc_id_tests) - if(WIN32) - set_tests_properties(guest_disc_id PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() +add_library(libSceDiscId SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceDiscId PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceDiscId) + +if(BUILD_TESTING) + add_test_executable(guest_disc_id_tests ${LIBS_INCLUDE_DIR}/tests/GuestDiscId.cpp) + target_include_directories(guest_disc_id_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_disc_id_tests PRIVATE libSceDiscId libc) + add_test(NAME guest_disc_id COMMAND guest_disc_id_tests) + if(WIN32) + set_tests_properties(guest_disc_id PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/tests/GuestDiscId.cpp b/core/libs/tests/GuestDiscId.cpp index 7a2ed36ed4..d849535842 100644 --- a/core/libs/tests/GuestDiscId.cpp +++ b/core/libs/tests/GuestDiscId.cpp @@ -1,42 +1,42 @@ -#include "prx/libc/include/general/VabiMacros.hpp" -#include -#include -#include - -struct DiscId; -struct DiscId2; - -extern "C" { -int APS5_VABI sceDiscIdGet(DiscId* discId); -int APS5_VABI sceDiscIdGet2(DiscId2* discId, std::uint32_t flags); -} - -namespace { - -void Require(bool condition) { - if (!condition) std::abort(); -} - -constexpr std::int32_t kErrNoDisc = static_cast(0x80D50002); - -} - -int main() { - Require(sceDiscIdGet(nullptr) == kErrNoDisc); - Require(sceDiscIdGet2(nullptr, 0) == kErrNoDisc); - Require(sceDiscIdGet2(nullptr, 0xFFFFFFFFu) == kErrNoDisc); - - std::uint8_t buffer[64]; - std::memset(buffer, 0xAB, sizeof(buffer)); - auto* id = reinterpret_cast(buffer); - auto* id2 = reinterpret_cast(buffer); - - Require(sceDiscIdGet(id) == kErrNoDisc); - Require(sceDiscIdGet2(id2, 0) == kErrNoDisc); - Require(sceDiscIdGet2(id2, 1) == kErrNoDisc); - Require(sceDiscIdGet2(id2, 3) == kErrNoDisc); - Require(sceDiscIdGet2(id2, 0xFFFFFFFFu) == kErrNoDisc); - for (std::uint8_t byte : buffer) Require(byte == 0xAB); - - return 0; -} +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include + +struct DiscId; +struct DiscId2; + +extern "C" { +int APS5_VABI sceDiscIdGet(DiscId* discId); +int APS5_VABI sceDiscIdGet2(DiscId2* discId, std::uint32_t flags); +} + +namespace { + +void Require(bool condition) { + if (!condition) std::abort(); +} + +constexpr std::int32_t kErrNoDisc = static_cast(0x80D50002); + +} + +int main() { + Require(sceDiscIdGet(nullptr) == kErrNoDisc); + Require(sceDiscIdGet2(nullptr, 0) == kErrNoDisc); + Require(sceDiscIdGet2(nullptr, 0xFFFFFFFFu) == kErrNoDisc); + + std::uint8_t buffer[64]; + std::memset(buffer, 0xAB, sizeof(buffer)); + auto* id = reinterpret_cast(buffer); + auto* id2 = reinterpret_cast(buffer); + + Require(sceDiscIdGet(id) == kErrNoDisc); + Require(sceDiscIdGet2(id2, 0) == kErrNoDisc); + Require(sceDiscIdGet2(id2, 1) == kErrNoDisc); + Require(sceDiscIdGet2(id2, 3) == kErrNoDisc); + Require(sceDiscIdGet2(id2, 0xFFFFFFFFu) == kErrNoDisc); + for (std::uint8_t byte : buffer) Require(byte == 0xAB); + + return 0; +}