From 9d52ab5144655950a152f09a179da1ae8bb4c4e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sat, 3 Jun 2017 17:43:16 +0200 Subject: [PATCH] IOS/ES: Move ImportTicket write function This commit moves the write function to where it should be (IOS), especially when ES::ImportTicket() is the only place to use it. Prevents misusing the ticket import function, and removes one unsafe direct write to the NAND that does not go through IOS. This also fixes the destination path: the session root is the one which should be used for determining the ticket path, not the configured one. --- Source/Core/Core/IOS/ES/TitleManagement.cpp | 20 ++++++++++++++++++-- Source/Core/DiscIO/NANDContentLoader.cpp | 20 -------------------- Source/Core/DiscIO/NANDContentLoader.h | 1 - 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Source/Core/Core/IOS/ES/TitleManagement.cpp b/Source/Core/Core/IOS/ES/TitleManagement.cpp index 1bfd229a96..505b4b869a 100644 --- a/Source/Core/Core/IOS/ES/TitleManagement.cpp +++ b/Source/Core/Core/IOS/ES/TitleManagement.cpp @@ -30,6 +30,21 @@ namespace HLE { namespace Device { +static ReturnCode WriteTicket(const IOS::ES::TicketReader& ticket) +{ + const u64 title_id = ticket.GetTitleId(); + + const std::string ticket_path = Common::GetTicketFileName(title_id, Common::FROM_SESSION_ROOT); + File::CreateFullPath(ticket_path); + + File::IOFile ticket_file(ticket_path, "wb"); + if (!ticket_file) + return ES_EIO; + + const std::vector& raw_ticket = ticket.GetRawTicket(); + return ticket_file.WriteBytes(raw_ticket.data(), raw_ticket.size()) ? IPC_SUCCESS : ES_EIO; +} + ReturnCode ES::ImportTicket(const std::vector& ticket_bytes) { IOS::ES::TicketReader ticket{ticket_bytes}; @@ -54,8 +69,9 @@ ReturnCode ES::ImportTicket(const std::vector& ticket_bytes) } } - if (!DiscIO::AddTicket(ticket)) - return ES_EIO; + const ReturnCode write_ret = WriteTicket(ticket); + if (write_ret != IPC_SUCCESS) + return write_ret; INFO_LOG(IOS_ES, "ImportTicket: Imported ticket for title %016" PRIx64, ticket.GetTitleId()); return IPC_SUCCESS; diff --git a/Source/Core/DiscIO/NANDContentLoader.cpp b/Source/Core/DiscIO/NANDContentLoader.cpp index e9700ac1e2..c1a806006d 100644 --- a/Source/Core/DiscIO/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/NANDContentLoader.cpp @@ -248,26 +248,6 @@ void CNANDContentManager::ClearCache() m_map.clear(); } -bool AddTicket(const IOS::ES::TicketReader& signed_ticket) -{ - if (!signed_ticket.IsValid()) - { - return false; - } - - u64 title_id = signed_ticket.GetTitleId(); - - std::string ticket_filename = Common::GetTicketFileName(title_id, Common::FROM_CONFIGURED_ROOT); - File::CreateFullPath(ticket_filename); - - File::IOFile ticket_file(ticket_filename, "wb"); - if (!ticket_file) - return false; - - const std::vector& raw_ticket = signed_ticket.GetRawTicket(); - return ticket_file.WriteBytes(raw_ticket.data(), raw_ticket.size()); -} - IOS::ES::TicketReader FindSignedTicket(u64 title_id) { std::string ticket_filename = Common::GetTicketFileName(title_id, Common::FROM_CONFIGURED_ROOT); diff --git a/Source/Core/DiscIO/NANDContentLoader.h b/Source/Core/DiscIO/NANDContentLoader.h index 7dee6b488c..de4157cd39 100644 --- a/Source/Core/DiscIO/NANDContentLoader.h +++ b/Source/Core/DiscIO/NANDContentLoader.h @@ -24,7 +24,6 @@ namespace DiscIO enum class Region; // TODO: move some of these to Core/IOS/ES. -bool AddTicket(const IOS::ES::TicketReader& signed_ticket); IOS::ES::TicketReader FindSignedTicket(u64 title_id); class CNANDContentData