summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Morph2021-01-28 01:23:29 -0500
committerGravatar Morph2021-01-28 01:32:24 -0500
commitae6b3bdfbffd5c234be9529616468f377a0b6844 (patch)
treeba197b9c4c45c8aa244be20f0ffa40db5d4625d2 /src
parenthle_ipc: Add Can(Read, Write)Buffer (diff)
downloadyuzu-ae6b3bdfbffd5c234be9529616468f377a0b6844.tar.gz
yuzu-ae6b3bdfbffd5c234be9529616468f377a0b6844.tar.xz
yuzu-ae6b3bdfbffd5c234be9529616468f377a0b6844.zip
prepo: Fix BufferDescriptorX invalid buffer errors and add "New" variants of SaveReport
The second input buffer could be optional when prepo/srepo is called, test for the availability of the second buffer prior to reading from it.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/prepo/prepo.cpp66
1 files changed, 42 insertions, 24 deletions
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp
index b417624c9..6edd45455 100644
--- a/src/core/hle/service/prepo/prepo.cpp
+++ b/src/core/hle/service/prepo/prepo.cpp
@@ -23,8 +23,8 @@ public:
23 {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"}, 23 {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
24 {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"}, 24 {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
25 {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"}, 25 {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
26 {10104, nullptr, "SaveReport"}, 26 {10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
27 {10105, nullptr, "SaveReportWithUser"}, 27 {10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
28 {10200, nullptr, "RequestImmediateTransmission"}, 28 {10200, nullptr, "RequestImmediateTransmission"},
29 {10300, nullptr, "GetTransmissionStatus"}, 29 {10300, nullptr, "GetTransmissionStatus"},
30 {10400, nullptr, "GetSystemSessionId"}, 30 {10400, nullptr, "GetSystemSessionId"},
@@ -59,16 +59,22 @@ private:
59 IPC::RequestParser rp{ctx}; 59 IPC::RequestParser rp{ctx};
60 const auto process_id = rp.PopRaw<u64>(); 60 const auto process_id = rp.PopRaw<u64>();
61 61
62 std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)}; 62 const auto data1 = ctx.ReadBuffer(0);
63 if constexpr (Type == Core::Reporter::PlayReportType::Old2) { 63 const auto data2 = [ctx] {
64 data.emplace_back(ctx.ReadBuffer(1)); 64 if (ctx.CanReadBuffer(1)) {
65 } 65 return ctx.ReadBuffer(1);
66 }
67
68 return std::vector<u8>{};
69 }();
66 70
67 LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", 71 LOG_DEBUG(Service_PREPO,
68 Type, process_id, data[0].size()); 72 "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}",
73 Type, process_id, data1.size(), data2.size());
69 74
70 const auto& reporter{system.GetReporter()}; 75 const auto& reporter{system.GetReporter()};
71 reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); 76 reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2},
77 process_id);
72 78
73 IPC::ResponseBuilder rb{ctx, 2}; 79 IPC::ResponseBuilder rb{ctx, 2};
74 rb.Push(RESULT_SUCCESS); 80 rb.Push(RESULT_SUCCESS);
@@ -79,24 +85,24 @@ private:
79 IPC::RequestParser rp{ctx}; 85 IPC::RequestParser rp{ctx};
80 const auto user_id = rp.PopRaw<u128>(); 86 const auto user_id = rp.PopRaw<u128>();
81 const auto process_id = rp.PopRaw<u64>(); 87 const auto process_id = rp.PopRaw<u64>();
82 std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)};
83 88
84 if constexpr (Type == Core::Reporter::PlayReportType::Old2) { 89 const auto data1 = ctx.ReadBuffer(0);
85 const auto read_buffer_count = 90 const auto data2 = [ctx] {
86 ctx.BufferDescriptorX().size() + ctx.BufferDescriptorA().size(); 91 if (ctx.CanReadBuffer(1)) {
87 if (read_buffer_count > 1) { 92 return ctx.ReadBuffer(1);
88 data.emplace_back(ctx.ReadBuffer(1));
89 } 93 }
90 }
91 94
92 LOG_DEBUG( 95 return std::vector<u8>{};
93 Service_PREPO, 96 }();
94 "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", 97
95 Type, user_id[1], user_id[0], process_id, data[0].size()); 98 LOG_DEBUG(Service_PREPO,
99 "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, "
100 "data1_size={:016X}, data2_size={:016X}",
101 Type, user_id[1], user_id[0], process_id, data1.size(), data2.size());
96 102
97 const auto& reporter{system.GetReporter()}; 103 const auto& reporter{system.GetReporter()};
98 reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, 104 reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), {data1, data2},
99 user_id); 105 process_id, user_id);
100 106
101 IPC::ResponseBuilder rb{ctx, 2}; 107 IPC::ResponseBuilder rb{ctx, 2};
102 rb.Push(RESULT_SUCCESS); 108 rb.Push(RESULT_SUCCESS);
@@ -107,7 +113,13 @@ private:
107 const auto title_id = rp.PopRaw<u64>(); 113 const auto title_id = rp.PopRaw<u64>();
108 114
109 const auto data1 = ctx.ReadBuffer(0); 115 const auto data1 = ctx.ReadBuffer(0);
110 const auto data2 = ctx.ReadBuffer(1); 116 const auto data2 = [ctx] {
117 if (ctx.CanReadBuffer(1)) {
118 return ctx.ReadBuffer(1);
119 }
120
121 return std::vector<u8>{};
122 }();
111 123
112 LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", 124 LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}",
113 title_id, data1.size(), data2.size()); 125 title_id, data1.size(), data2.size());
@@ -125,7 +137,13 @@ private:
125 const auto title_id = rp.PopRaw<u64>(); 137 const auto title_id = rp.PopRaw<u64>();
126 138
127 const auto data1 = ctx.ReadBuffer(0); 139 const auto data1 = ctx.ReadBuffer(0);
128 const auto data2 = ctx.ReadBuffer(1); 140 const auto data2 = [ctx] {
141 if (ctx.CanReadBuffer(1)) {
142 return ctx.ReadBuffer(1);
143 }
144
145 return std::vector<u8>{};
146 }();
129 147
130 LOG_DEBUG(Service_PREPO, 148 LOG_DEBUG(Service_PREPO,
131 "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, " 149 "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, "