diff --git a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp index 6a36e920..2a9879a7 100644 --- a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp +++ b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp @@ -289,7 +289,7 @@ namespace ams::sf::hipc { util::TypedStorage 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(); diff --git a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp index bbcf0468..af10c89c 100644 --- a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp +++ b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp @@ -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; } diff --git a/libstratosphere/source/sf/hipc/sf_hipc_server_manager.cpp b/libstratosphere/source/sf/hipc/sf_hipc_server_manager.cpp index 6717f4f6..7e8f3cbb 100644 --- a/libstratosphere/source/sf/hipc/sf_hipc_server_manager.cpp +++ b/libstratosphere/source/sf/hipc/sf_hipc_server_manager.cpp @@ -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)) {