Merge pull request #2796 from yuriks/hle-null-handles
Kernel/IPC: Support translation of null handles
This commit is contained in:
commit
8223d18088
2 changed files with 36 additions and 8 deletions
|
@ -67,11 +67,14 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* sr
|
||||||
ASSERT(i + num_handles <= command_size); // TODO(yuriks): Return error
|
ASSERT(i + num_handles <= command_size); // TODO(yuriks): Return error
|
||||||
for (u32 j = 0; j < num_handles; ++j) {
|
for (u32 j = 0; j < num_handles; ++j) {
|
||||||
Handle handle = src_cmdbuf[i];
|
Handle handle = src_cmdbuf[i];
|
||||||
SharedPtr<Object> object = src_table.GetGeneric(handle);
|
SharedPtr<Object> object = nullptr;
|
||||||
|
if (handle != 0) {
|
||||||
|
object = src_table.GetGeneric(handle);
|
||||||
ASSERT(object != nullptr); // TODO(yuriks): Return error
|
ASSERT(object != nullptr); // TODO(yuriks): Return error
|
||||||
if (descriptor == IPC::DescriptorType::MoveHandle) {
|
if (descriptor == IPC::DescriptorType::MoveHandle) {
|
||||||
src_table.Close(handle);
|
src_table.Close(handle);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cmd_buf[i++] = AddOutgoingHandle(std::move(object));
|
cmd_buf[i++] = AddOutgoingHandle(std::move(object));
|
||||||
}
|
}
|
||||||
|
@ -112,9 +115,11 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P
|
||||||
ASSERT(i + num_handles <= command_size);
|
ASSERT(i + num_handles <= command_size);
|
||||||
for (u32 j = 0; j < num_handles; ++j) {
|
for (u32 j = 0; j < num_handles; ++j) {
|
||||||
SharedPtr<Object> object = GetIncomingHandle(cmd_buf[i]);
|
SharedPtr<Object> object = GetIncomingHandle(cmd_buf[i]);
|
||||||
|
Handle handle = 0;
|
||||||
|
if (object != nullptr) {
|
||||||
// TODO(yuriks): Figure out the proper error handling for if this fails
|
// TODO(yuriks): Figure out the proper error handling for if this fails
|
||||||
Handle handle = dst_table.Create(object).Unwrap();
|
handle = dst_table.Create(object).Unwrap();
|
||||||
|
}
|
||||||
dst_cmdbuf[i++] = handle;
|
dst_cmdbuf[i++] = handle;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -18,7 +18,7 @@ static SharedPtr<Object> MakeObject() {
|
||||||
return Event::Create(ResetType::OneShot);
|
return Event::Create(ResetType::OneShot);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("HLERequestContext::PopoulateFromIncomingCommandBuffer", "[core][kernel]") {
|
TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel]") {
|
||||||
auto session = std::get<SharedPtr<ServerSession>>(ServerSession::CreateSessionPair());
|
auto session = std::get<SharedPtr<ServerSession>>(ServerSession::CreateSessionPair());
|
||||||
HLERequestContext context(std::move(session));
|
HLERequestContext context(std::move(session));
|
||||||
|
|
||||||
|
@ -94,6 +94,18 @@ TEST_CASE("HLERequestContext::PopoulateFromIncomingCommandBuffer", "[core][kerne
|
||||||
REQUIRE(context.GetIncomingHandle(output[5]) == c);
|
REQUIRE(context.GetIncomingHandle(output[5]) == c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("translates null handles") {
|
||||||
|
const u32_le input[]{
|
||||||
|
IPC::MakeHeader(0, 0, 2), IPC::MoveHandleDesc(1), 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
auto result = context.PopulateFromIncomingCommandBuffer(input, *process, handle_table);
|
||||||
|
|
||||||
|
REQUIRE(result == RESULT_SUCCESS);
|
||||||
|
auto* output = context.CommandBuffer();
|
||||||
|
REQUIRE(context.GetIncomingHandle(output[2]) == nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("translates CallingPid descriptors") {
|
SECTION("translates CallingPid descriptors") {
|
||||||
const u32_le input[]{
|
const u32_le input[]{
|
||||||
IPC::MakeHeader(0, 0, 2), IPC::CallingPidDesc(), 0x98989898,
|
IPC::MakeHeader(0, 0, 2), IPC::CallingPidDesc(), 0x98989898,
|
||||||
|
@ -171,6 +183,17 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") {
|
||||||
REQUIRE(handle_table.GetGeneric(output[4]) == b);
|
REQUIRE(handle_table.GetGeneric(output[4]) == b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("translates null handles") {
|
||||||
|
input[0] = IPC::MakeHeader(0, 0, 2);
|
||||||
|
input[1] = IPC::MoveHandleDesc(1);
|
||||||
|
input[2] = context.AddOutgoingHandle(nullptr);
|
||||||
|
|
||||||
|
auto result = context.WriteToOutgoingCommandBuffer(output, *process, handle_table);
|
||||||
|
|
||||||
|
REQUIRE(result == RESULT_SUCCESS);
|
||||||
|
REQUIRE(output[2] == 0);
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("translates multi-handle descriptors") {
|
SECTION("translates multi-handle descriptors") {
|
||||||
auto a = MakeObject();
|
auto a = MakeObject();
|
||||||
auto b = MakeObject();
|
auto b = MakeObject();
|
||||||
|
|
Loading…
Reference in a new issue