strat: fix some mitm server management logic

This commit is contained in:
Michael Scire 2021-10-14 00:40:43 -07:00
parent 891fa32bf1
commit 7e536f74ae
4 changed files with 19 additions and 4 deletions

View file

@ -289,7 +289,7 @@ namespace ams::sf::hipc {
util::TypedStorage<ServerSession> m_session_storages[MaxSessions];
bool m_session_allocated[MaxSessions];
u8 m_pointer_buffer_storage[0x10 + (MaxSessions * ManagerOptions::PointerBufferSize)];
u8 m_saved_message_storage[0x10 + (MaxSessions * (ManagerOptions::CanDeferInvokeRequest ? hipc::TlsMessageBufferSize : 0))];
u8 m_saved_message_storage[0x10 + (MaxSessions * ((ManagerOptions::CanDeferInvokeRequest || ManagerOptions::CanManageMitmServers) ? hipc::TlsMessageBufferSize : 0))];
uintptr_t m_pointer_buffers_start;
uintptr_t m_saved_messages_start;
@ -403,7 +403,7 @@ namespace ams::sf::hipc {
}
virtual cmif::PointerAndSize GetSessionSavedMessageBuffer(const ServerSession *session) const override final {
if constexpr (ManagerOptions::CanDeferInvokeRequest) {
if constexpr (ManagerOptions::CanDeferInvokeRequest || ManagerOptions::CanManageMitmServers) {
return this->GetObjectBySessionIndex(session, m_saved_messages_start, hipc::TlsMessageBufferSize);
} else {
return cmif::PointerAndSize();

View file

@ -69,6 +69,12 @@ namespace ams::sf::hipc {
AMS_ABORT_UNLESS(util::GetReference(m_forward_service) != nullptr);
}
~ServerSession() {
if (m_has_forward_service) {
util::DestroyAt(m_forward_service);
}
}
ALWAYS_INLINE bool IsMitmSession() const {
return m_has_forward_service;
}

View file

@ -135,6 +135,13 @@ namespace ams::sf::hipc {
if (!session->m_has_received) {
R_TRY(this->ReceiveRequest(session, tls_message));
session->m_has_received = true;
if (this->CanManageMitmServers()) {
const cmif::PointerAndSize &saved_message = session->m_saved_message;
AMS_ABORT_UNLESS(tls_message.GetSize() == saved_message.GetSize());
std::memcpy(saved_message.GetPointer(), tls_message.GetPointer(), tls_message.GetSize());
}
}
R_TRY_CATCH(this->ProcessRequest(session, tls_message)) {

View file

@ -624,9 +624,11 @@ namespace ams::sm::impl {
R_TRY(ValidateAccessControl(AccessControlEntry(proc->access_control, proc->access_control_size), service, false, false));
}
/* Get service info. Check to see if we need to defer this until later. */
/* Get service info/mitm info. */
ServiceInfo *service_info = GetServiceInfo(service);
MitmInfo *mitm_info = GetMitmInfo(service_info);
MitmInfo *mitm_info = service_info != nullptr ? GetMitmInfo(service_info) : nullptr;
/* Check to see if we need to defer until later. */
R_UNLESS(service_info != nullptr, tipc::ResultRequestDeferred());
R_UNLESS(!ShouldDeferForInit(service), tipc::ResultRequestDeferred());
R_UNLESS(!HasFutureMitmDeclaration(service), tipc::ResultRequestDeferred());