diff options
author | bunnei <bunneidev@gmail.com> | 2021-05-11 21:27:43 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2021-05-11 21:27:43 +0200 |
commit | 12d569e483834c74613a744abee7f277cc3d4e16 (patch) | |
tree | 663ca7c22302b96d2984d273ec487b1cf0e8db65 /src/core/hle/kernel/hle_ipc.cpp | |
parent | WORKAROUND: temp. disable session resource limits while we work out issues (diff) | |
download | yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar.gz yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar.bz2 yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar.lz yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar.xz yuzu-12d569e483834c74613a744abee7f277cc3d4e16.tar.zst yuzu-12d569e483834c74613a744abee7f277cc3d4e16.zip |
Diffstat (limited to 'src/core/hle/kernel/hle_ipc.cpp')
-rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index edb3f8d98..ce3466df8 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -186,6 +186,18 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(KThread& requesting_t auto& owner_process = *requesting_thread.GetOwnerProcess(); auto& handle_table = owner_process.GetHandleTable(); + // The data_size already includes the payload header, the padding and the domain header. + std::size_t size{}; + + if (IsTipc()) { + size = cmd_buf.size(); + } else { + size = data_payload_offset + data_size - sizeof(IPC::DataPayloadHeader) / sizeof(u32) - 4; + if (Session()->IsDomain()) { + size -= sizeof(IPC::DomainMessageHeader) / sizeof(u32); + } + } + for (auto& object : copy_objects) { Handle handle{}; if (object) { @@ -218,7 +230,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(KThread& requesting_t // Copy the translated command buffer back into the thread's command buffer area. memory.WriteBlock(owner_process, requesting_thread.GetTLSAddress(), cmd_buf.data(), - cmd_buf.size() * sizeof(u32)); + size * sizeof(u32)); return RESULT_SUCCESS; } |