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.
This commit is contained in:
StoneDC authored and Adrià Franch committed 2026-10-26 14:35:14 +01:00
1 parent 85d158234c
commit 3fee9d12ac
2 files changed
+56 -56

No files matched your search

+14 -14
View File
@@ -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:$<TARGET_FILE_DIR:libSceDiscId>")
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:$<TARGET_FILE_DIR:libSceDiscId>")
endif()
endif()
+42 -42
View File
@@ -1,42 +1,42 @@
#include "prx/libc/include/general/VabiMacros.hpp"
#include <cstdint>
#include <cstdlib>
#include <cstring>
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<std::int32_t>(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<DiscId*>(buffer);
auto* id2 = reinterpret_cast<DiscId2*>(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 <cstdint>
#include <cstdlib>
#include <cstring>
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<std::int32_t>(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<DiscId*>(buffer);
auto* id2 = reinterpret_cast<DiscId2*>(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;
}