diff --git a/core/libs/prx/libc/include/SonyCrt.hpp b/core/libs/prx/libc/include/SonyCrt.hpp index 2016da156..56fe7b6a1 100644 --- a/core/libs/prx/libc/include/SonyCrt.hpp +++ b/core/libs/prx/libc/include/SonyCrt.hpp @@ -125,10 +125,11 @@ inline int SonyWcscpyS(std::uint16_t* dest, std::size_t size, const std::uint16_ inline std::size_t SonyMbstowcs(std::uint16_t* dest, const char* src, std::size_t size) { if (!src) return 0; + if (!dest) return std::strlen(src); std::size_t converted = 0; while (converted < size) { const auto value = static_cast(src[converted]); - if (dest) dest[converted] = value; + dest[converted] = value; if (value == 0) return converted; ++converted; } diff --git a/core/libs/tests/GuestCrt.cpp b/core/libs/tests/GuestCrt.cpp index 611ddc32a..f37cb68bb 100644 --- a/core/libs/tests/GuestCrt.cpp +++ b/core/libs/tests/GuestCrt.cpp @@ -144,6 +144,8 @@ int main() { Require(sceAmprMbstowcs(wide, "ABC", 8) == 3); Require(wide[0] == 65 && wide[1] == 66 && wide[2] == 67 && wide[3] == 0); Require(sceAmprMbstowcs(nullptr, "ABC", 8) == 3); + Require(sceAmprMbstowcs(nullptr, "ABC", 0) == 3 && sceAmprMbstowcs(nullptr, "ABC", 1) == 3); + Require(mbstowcs_nid_postfix(nullptr, "ABC", 0) == 3 && mbstowcs_nid_postfix(nullptr, "ABC", 1) == 3); Require(sceAmprMbstowcs(wide, "ABC", 2) == 2); Require(mbstowcs_nid_postfix(wide, "ABC", 8) == 3);