diff options
| author | 2020-02-07 16:25:42 -0500 | |
|---|---|---|
| committer | 2020-02-07 16:25:42 -0500 | |
| commit | aa3f9b960697da4a62a9e9987bc2a0db6a1ce5a8 (patch) | |
| tree | 2d78c77be18d85f3c74be438fcef877cf55b5a1a /src | |
| parent | Merge pull request #3362 from ReinUsesLisp/fix-instanced (diff) | |
| parent | services: prepo: Fix IPC interface with SaveReport/SaveReportWithUser. (diff) | |
| download | yuzu-aa3f9b960697da4a62a9e9987bc2a0db6a1ce5a8.tar.gz yuzu-aa3f9b960697da4a62a9e9987bc2a0db6a1ce5a8.tar.xz yuzu-aa3f9b960697da4a62a9e9987bc2a0db6a1ce5a8.zip | |
Merge pull request #3381 from bunnei/ipc-fix
hle: services: Fix prepo IPC, and add better error checking.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 50 | ||||
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 30 |
2 files changed, 57 insertions, 23 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 2db28dcf0..ab05788d7 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -284,13 +284,18 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) { | |||
| 284 | 284 | ||
| 285 | std::vector<u8> HLERequestContext::ReadBuffer(int buffer_index) const { | 285 | std::vector<u8> HLERequestContext::ReadBuffer(int buffer_index) const { |
| 286 | std::vector<u8> buffer; | 286 | std::vector<u8> buffer; |
| 287 | const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()}; | 287 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && |
| 288 | BufferDescriptorA()[buffer_index].Size()}; | ||
| 288 | auto& memory = Core::System::GetInstance().Memory(); | 289 | auto& memory = Core::System::GetInstance().Memory(); |
| 289 | 290 | ||
| 290 | if (is_buffer_a) { | 291 | if (is_buffer_a) { |
| 292 | ASSERT_MSG(BufferDescriptorA().size() > buffer_index, | ||
| 293 | "BufferDescriptorA invalid buffer_index {}", buffer_index); | ||
| 291 | buffer.resize(BufferDescriptorA()[buffer_index].Size()); | 294 | buffer.resize(BufferDescriptorA()[buffer_index].Size()); |
| 292 | memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), buffer.size()); | 295 | memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), buffer.size()); |
| 293 | } else { | 296 | } else { |
| 297 | ASSERT_MSG(BufferDescriptorX().size() > buffer_index, | ||
| 298 | "BufferDescriptorX invalid buffer_index {}", buffer_index); | ||
| 294 | buffer.resize(BufferDescriptorX()[buffer_index].Size()); | 299 | buffer.resize(BufferDescriptorX()[buffer_index].Size()); |
| 295 | memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), buffer.size()); | 300 | memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), buffer.size()); |
| 296 | } | 301 | } |
| @@ -305,7 +310,8 @@ std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | |||
| 305 | return 0; | 310 | return 0; |
| 306 | } | 311 | } |
| 307 | 312 | ||
| 308 | const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()}; | 313 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && |
| 314 | BufferDescriptorB()[buffer_index].Size()}; | ||
| 309 | const std::size_t buffer_size{GetWriteBufferSize(buffer_index)}; | 315 | const std::size_t buffer_size{GetWriteBufferSize(buffer_index)}; |
| 310 | if (size > buffer_size) { | 316 | if (size > buffer_size) { |
| 311 | LOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size, | 317 | LOG_CRITICAL(Core, "size ({:016X}) is greater than buffer_size ({:016X})", size, |
| @@ -315,8 +321,16 @@ std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | |||
| 315 | 321 | ||
| 316 | auto& memory = Core::System::GetInstance().Memory(); | 322 | auto& memory = Core::System::GetInstance().Memory(); |
| 317 | if (is_buffer_b) { | 323 | if (is_buffer_b) { |
| 324 | ASSERT_MSG(BufferDescriptorB().size() > buffer_index, | ||
| 325 | "BufferDescriptorB invalid buffer_index {}", buffer_index); | ||
| 326 | ASSERT_MSG(BufferDescriptorB()[buffer_index].Size() >= size, | ||
| 327 | "BufferDescriptorB buffer_index {} is not large enough", buffer_index); | ||
| 318 | memory.WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); | 328 | memory.WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); |
| 319 | } else { | 329 | } else { |
| 330 | ASSERT_MSG(BufferDescriptorC().size() > buffer_index, | ||
| 331 | "BufferDescriptorC invalid buffer_index {}", buffer_index); | ||
| 332 | ASSERT_MSG(BufferDescriptorC()[buffer_index].Size() >= size, | ||
| 333 | "BufferDescriptorC buffer_index {} is not large enough", buffer_index); | ||
| 320 | memory.WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); | 334 | memory.WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); |
| 321 | } | 335 | } |
| 322 | 336 | ||
| @@ -324,15 +338,35 @@ std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | |||
| 324 | } | 338 | } |
| 325 | 339 | ||
| 326 | std::size_t HLERequestContext::GetReadBufferSize(int buffer_index) const { | 340 | std::size_t HLERequestContext::GetReadBufferSize(int buffer_index) const { |
| 327 | const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()}; | 341 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && |
| 328 | return is_buffer_a ? BufferDescriptorA()[buffer_index].Size() | 342 | BufferDescriptorA()[buffer_index].Size()}; |
| 329 | : BufferDescriptorX()[buffer_index].Size(); | 343 | if (is_buffer_a) { |
| 344 | ASSERT_MSG(BufferDescriptorA().size() > buffer_index, | ||
| 345 | "BufferDescriptorA invalid buffer_index {}", buffer_index); | ||
| 346 | ASSERT_MSG(BufferDescriptorA()[buffer_index].Size() > 0, | ||
| 347 | "BufferDescriptorA buffer_index {} is empty", buffer_index); | ||
| 348 | return BufferDescriptorA()[buffer_index].Size(); | ||
| 349 | } else { | ||
| 350 | ASSERT_MSG(BufferDescriptorX().size() > buffer_index, | ||
| 351 | "BufferDescriptorX invalid buffer_index {}", buffer_index); | ||
| 352 | ASSERT_MSG(BufferDescriptorX()[buffer_index].Size() > 0, | ||
| 353 | "BufferDescriptorX buffer_index {} is empty", buffer_index); | ||
| 354 | return BufferDescriptorX()[buffer_index].Size(); | ||
| 355 | } | ||
| 330 | } | 356 | } |
| 331 | 357 | ||
| 332 | std::size_t HLERequestContext::GetWriteBufferSize(int buffer_index) const { | 358 | std::size_t HLERequestContext::GetWriteBufferSize(int buffer_index) const { |
| 333 | const bool is_buffer_b{BufferDescriptorB().size() && BufferDescriptorB()[buffer_index].Size()}; | 359 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && |
| 334 | return is_buffer_b ? BufferDescriptorB()[buffer_index].Size() | 360 | BufferDescriptorB()[buffer_index].Size()}; |
| 335 | : BufferDescriptorC()[buffer_index].Size(); | 361 | if (is_buffer_b) { |
| 362 | ASSERT_MSG(BufferDescriptorB().size() > buffer_index, | ||
| 363 | "BufferDescriptorB invalid buffer_index {}", buffer_index); | ||
| 364 | return BufferDescriptorB()[buffer_index].Size(); | ||
| 365 | } else { | ||
| 366 | ASSERT_MSG(BufferDescriptorC().size() > buffer_index, | ||
| 367 | "BufferDescriptorC invalid buffer_index {}", buffer_index); | ||
| 368 | return BufferDescriptorC()[buffer_index].Size(); | ||
| 369 | } | ||
| 336 | } | 370 | } |
| 337 | 371 | ||
| 338 | std::string HLERequestContext::Description() const { | 372 | std::string HLERequestContext::Description() const { |
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index 5eb26caf8..8f1be0e48 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp | |||
| @@ -50,16 +50,16 @@ private: | |||
| 50 | IPC::RequestParser rp{ctx}; | 50 | IPC::RequestParser rp{ctx}; |
| 51 | const auto process_id = rp.PopRaw<u64>(); | 51 | const auto process_id = rp.PopRaw<u64>(); |
| 52 | 52 | ||
| 53 | const auto data1 = ctx.ReadBuffer(0); | 53 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; |
| 54 | const auto data2 = ctx.ReadBuffer(1); | 54 | if (Type == Core::Reporter::PlayReportType::New) { |
| 55 | data.emplace_back(ctx.ReadBuffer(1)); | ||
| 56 | } | ||
| 55 | 57 | ||
| 56 | LOG_DEBUG(Service_PREPO, | 58 | LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", |
| 57 | "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}", | 59 | static_cast<u8>(Type), process_id, data[0].size()); |
| 58 | static_cast<u8>(Type), process_id, data1.size(), data2.size()); | ||
| 59 | 60 | ||
| 60 | const auto& reporter{system.GetReporter()}; | 61 | const auto& reporter{system.GetReporter()}; |
| 61 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, | 62 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); |
| 62 | process_id); | ||
| 63 | 63 | ||
| 64 | IPC::ResponseBuilder rb{ctx, 2}; | 64 | IPC::ResponseBuilder rb{ctx, 2}; |
| 65 | rb.Push(RESULT_SUCCESS); | 65 | rb.Push(RESULT_SUCCESS); |
| @@ -70,19 +70,19 @@ private: | |||
| 70 | IPC::RequestParser rp{ctx}; | 70 | IPC::RequestParser rp{ctx}; |
| 71 | const auto user_id = rp.PopRaw<u128>(); | 71 | const auto user_id = rp.PopRaw<u128>(); |
| 72 | const auto process_id = rp.PopRaw<u64>(); | 72 | const auto process_id = rp.PopRaw<u64>(); |
| 73 | 73 | std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; | |
| 74 | const auto data1 = ctx.ReadBuffer(0); | 74 | if (Type == Core::Reporter::PlayReportType::New) { |
| 75 | const auto data2 = ctx.ReadBuffer(1); | 75 | data.emplace_back(ctx.ReadBuffer(1)); |
| 76 | } | ||
| 76 | 77 | ||
| 77 | LOG_DEBUG( | 78 | LOG_DEBUG( |
| 78 | Service_PREPO, | 79 | Service_PREPO, |
| 79 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}, " | 80 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", |
| 80 | "data2_size={:016X}", | 81 | static_cast<u8>(Type), user_id[1], user_id[0], process_id, data[0].size()); |
| 81 | static_cast<u8>(Type), user_id[1], user_id[0], process_id, data1.size(), data2.size()); | ||
| 82 | 82 | ||
| 83 | const auto& reporter{system.GetReporter()}; | 83 | const auto& reporter{system.GetReporter()}; |
| 84 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2}, | 84 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, |
| 85 | process_id, user_id); | 85 | user_id); |
| 86 | 86 | ||
| 87 | IPC::ResponseBuilder rb{ctx, 2}; | 87 | IPC::ResponseBuilder rb{ctx, 2}; |
| 88 | rb.Push(RESULT_SUCCESS); | 88 | rb.Push(RESULT_SUCCESS); |