diff --git a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp index 3890373c44..cfb6e84cc1 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp @@ -297,18 +297,29 @@ vm::ptr _sys_strcpy(vm::ptr dst, vm::cptr src) } } -vm::ptr _sys_strncpy(vm::ptr dest, vm::cptr source, u32 len) +vm::ptr _sys_strncpy(vm::ptr dst, vm::cptr src, s32 len) { - sysPrxForUser.trace("_sys_strncpy(dest=*0x%x, source=%s, len=%d)", dest, source, len); + sysPrxForUser.trace("_sys_strncpy(dst=*0x%x %s, src=%s, len=%d)", dst, dst, src, len); - if (!dest || !source) + if (!dst || !src) { return vm::null; } - verify(HERE), std::strncpy(dest.get_ptr(), source.get_ptr(), len) == dest.get_ptr(); + for (s32 i = 0; i < len; i++) + { + if (!(dst[i] = src[i])) + { + for (++i; i < len; i++) + { + dst[i] = '\0'; + } - return dest; + return dst; + } + } + + return dst; } s32 _sys_strncasecmp(vm::cptr str1, vm::cptr str2, u32 n)