diff options
| author | mailwl <mailwl@gmail.com> | 2018-02-20 19:27:49 +0300 | 
|---|---|---|
| committer | mailwl <mailwl@gmail.com> | 2018-02-20 19:27:49 +0300 | 
| commit | 1572c45aa05febd01b3765706d701e935a5c60f3 (patch) | |
| tree | 53c36e4bc1ec4d562314df88daa76667a5ce7deb | |
| parent | 6a2197806ef8ca045f43f340255b8e8195efe4e4 (diff) | |
IPC: add domain header to response if only it exists in request
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 2 | 
3 files changed, 8 insertions, 6 deletions
| diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index 6066d8a18..97290fec5 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h @@ -118,7 +118,7 @@ public:          AlignWithPadding(); -        if (context.Session()->IsDomain()) { +        if (context.Session()->IsDomain() && context.GetDomainMessageHeader()) {              IPC::DomainMessageHeader domain_header{};              domain_header.num_objects = num_domain_objects;              PushRaw(domain_header); diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 25ba26f18..3b1f3154d 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -85,9 +85,11 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) {      if (Session()->IsDomain() && (command_header->type == IPC::CommandType::Request || !incoming)) {          // If this is an incoming message, only CommandType "Request" has a domain header -        // All outgoing domain messages have the domain header -        domain_message_header = -            std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); +        // All outgoing domain messages have the domain header, if only incoming has it +        if (incoming || domain_message_header) { +            domain_message_header = +                std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); +        }      }      data_payload_header = @@ -196,7 +198,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, P      // TODO(Subv): Translate the X/A/B/W buffers. -    if (Session()->IsDomain()) { +    if (domain_message_header && Session()->IsDomain()) {          ASSERT(domain_message_header->num_objects == domain_objects.size());          // Write the domain objects to the command buffer, these go after the raw untranslated data.          // TODO(Subv): This completely ignores C buffers. diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 5608418c3..42c2f760b 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -96,7 +96,7 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) {      ResultCode result = RESULT_SUCCESS;      // If the session has been converted to a domain, handle the domain request -    if (IsDomain()) { +    if (context.GetDomainMessageHeader() && IsDomain()) {          result = HandleDomainSyncRequest(context);          // If there is no domain header, the regular session handler is used      } else if (hle_handler != nullptr) { | 
