diff --git a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp index cfb6e84cc1..284cf7c64f 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp @@ -275,13 +275,27 @@ vm::cptr _sys_strchr(vm::cptr str, char ch) } } -vm::ptr _sys_strncat(vm::ptr dest, vm::cptr source, u32 len) +vm::ptr _sys_strncat(vm::ptr dst, vm::cptr src, u32 max) { - sysPrxForUser.trace("_sys_strncat(dest=*0x%x, source=%s, len=%d)", dest, source, len); + sysPrxForUser.trace("_sys_strncat(dst=*0x%x %s, src=%s, max=%u)", dst, dst, src, max); - verify(HERE), std::strncat(dest.get_ptr(), source.get_ptr(), len) == dest.get_ptr(); + auto str = dst; - return dest; + while (*str) + { + str++; + } + + for (u32 i = 0; i < max; i++) + { + if (!(str[i] = src[i])) + { + return dst; + } + } + + str[max] = '\0'; + return dst; } vm::ptr _sys_strcpy(vm::ptr dst, vm::cptr src)