Merge pull request #5650 from leoetlino/check-contents
IOS/ES: Add some sanity checks to ImportTitleDone
This commit is contained in:
commit
09edd62cce
|
@ -61,6 +61,11 @@ bool Content::IsShared() const
|
|||
return (type & 0x8000) != 0;
|
||||
}
|
||||
|
||||
bool Content::IsOptional() const
|
||||
{
|
||||
return (type & 0x4000) != 0;
|
||||
}
|
||||
|
||||
SignedBlobReader::SignedBlobReader(const std::vector<u8>& bytes) : m_bytes(bytes)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -83,6 +83,7 @@ static_assert(sizeof(TMDHeader) == 0x1e4, "TMDHeader has the wrong size");
|
|||
struct Content
|
||||
{
|
||||
bool IsShared() const;
|
||||
bool IsOptional() const;
|
||||
u32 id;
|
||||
u16 index;
|
||||
u16 type;
|
||||
|
|
|
@ -350,7 +350,25 @@ IPCCommandResult ES::ImportContentEnd(Context& context, const IOCtlVRequest& req
|
|||
|
||||
ReturnCode ES::ImportTitleDone(Context& context)
|
||||
{
|
||||
if (!context.title_import.tmd.IsValid())
|
||||
if (!context.title_import.tmd.IsValid() || context.title_import.content_id != 0xFFFFFFFF)
|
||||
return ES_EINVAL;
|
||||
|
||||
// Make sure all listed, non-optional contents have been imported.
|
||||
const u64 title_id = context.title_import.tmd.GetTitleId();
|
||||
const std::vector<IOS::ES::Content> contents = context.title_import.tmd.GetContents();
|
||||
const IOS::ES::SharedContentMap shared_content_map{Common::FROM_SESSION_ROOT};
|
||||
const bool has_all_required_contents =
|
||||
std::all_of(contents.cbegin(), contents.cend(), [&](const IOS::ES::Content& content) {
|
||||
if (content.IsOptional())
|
||||
return true;
|
||||
|
||||
if (content.IsShared())
|
||||
return shared_content_map.GetFilenameFromSHA1(content.sha1).has_value();
|
||||
|
||||
return File::Exists(Common::GetTitleContentPath(title_id, Common::FROM_SESSION_ROOT) +
|
||||
StringFromFormat("%08x.app", content.id));
|
||||
});
|
||||
if (!has_all_required_contents)
|
||||
return ES_EINVAL;
|
||||
|
||||
if (!WriteImportTMD(context.title_import.tmd))
|
||||
|
@ -359,7 +377,7 @@ ReturnCode ES::ImportTitleDone(Context& context)
|
|||
if (!FinishImport(context.title_import.tmd))
|
||||
return ES_EIO;
|
||||
|
||||
INFO_LOG(IOS_ES, "ImportTitleDone: title %016" PRIx64, context.title_import.tmd.GetTitleId());
|
||||
INFO_LOG(IOS_ES, "ImportTitleDone: title %016" PRIx64, title_id);
|
||||
context.title_import.tmd.SetBytes({});
|
||||
return IPC_SUCCESS;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue