sprofile: various correctness fixes.

This commit is contained in:
Michael Scire 2021-10-29 17:38:44 -07:00
parent 2a0b99d9f9
commit 4e92687cab
6 changed files with 24 additions and 4 deletions

View file

@ -89,9 +89,8 @@ namespace ams::fs {
Result DeleteSystemSaveData(SaveDataSpaceId space_id, SystemSaveDataId id, UserId user_id) {
const auto attribute = SaveDataAttribute::Make(ncm::InvalidProgramId, SaveDataType::System, user_id, id);
/* TODO: Libnx binding for DeleteSaveDataFileSystemBySaveDataAttribute */
AMS_UNUSED(space_id, attribute);
AMS_ABORT();
static_assert(sizeof(attribute) == sizeof(::FsSaveDataAttribute));
return fsDeleteSaveDataFileSystemBySaveDataAttribute(static_cast<::FsSaveDataSpaceId>(space_id), reinterpret_cast<const ::FsSaveDataAttribute *>(std::addressof(attribute)));
}
Result GetSaveDataFlags(u32 *out, SaveDataId id) {

View file

@ -26,6 +26,10 @@ namespace ams::sprofile::srv {
ProfileManager *m_manager;
public:
ProfileImporterImpl(ProfileManager *manager) : m_manager(manager) { /* ... */ }
~ProfileImporterImpl() {
m_manager->CloseProfileImporter();
}
public:
Result ImportProfile(const sprofile::srv::ProfileDataForImportData &import);
Result Commit();

View file

@ -151,6 +151,16 @@ namespace ams::sprofile::srv {
return ResultSuccess();
}
void ProfileManager::CloseProfileImporter() {
/* Acquire locks. */
std::scoped_lock lk1(m_profile_importer_mutex);
std::scoped_lock lk2(m_general_mutex);
std::scoped_lock lk3(m_fs_mutex);
/* Close our importer. */
m_profile_importer = util::nullopt;
}
Result ProfileManager::ImportProfile(const sprofile::srv::ProfileDataForImportData &import) {
/* Acquire locks. */
std::scoped_lock lk1(m_profile_importer_mutex);
@ -165,6 +175,8 @@ namespace ams::sprofile::srv {
/* Check that the metadata we're importing has a valid hash. */
{
crypto::Md5Generator md5;
md5.Initialize();
md5.Update(std::addressof(import.header), sizeof(import.header));
md5.Update(std::addressof(import.data), sizeof(import.data) - sizeof(import.data.entries[0]) * (util::size(import.data.entries) - std::min<size_t>(import.data.num_entries, util::size(import.data.entries))));
@ -258,6 +270,8 @@ namespace ams::sprofile::srv {
/* Check that the metadata we're importing has a valid hash. */
{
crypto::Md5Generator md5;
md5.Initialize();
md5.Update(std::addressof(import.header), sizeof(import.header));
md5.Update(std::addressof(import.metadata), sizeof(import.metadata));
md5.Update(std::addressof(import.profile_urls), sizeof(import.profile_urls[0]) * std::min<size_t>(import.metadata.num_entries, util::size(import.metadata.entries)));

View file

@ -50,6 +50,8 @@ namespace ams::sprofile::srv {
Result ResetSaveData();
Result OpenProfileImporter();
void CloseProfileImporter();
Result ImportProfile(const sprofile::srv::ProfileDataForImportData &data);
Result Commit();
Result ImportMetadata(const sprofile::srv::ProfileMetadataForImportMetadata &data);

View file

@ -74,6 +74,7 @@ namespace ams::sprofile::srv {
return ResultSuccess();
}
Result ServiceForBgAgent::IsUpdateNeeded(sf::Out<bool> out, Identifier revision_key) {
/* Load primary metadata. */
bool loaded_metadata = true;

View file

@ -149,7 +149,7 @@ namespace ams::crypto::impl {
/* Copy in any leftover data. */
if (const auto left = size % BlockSize; left > 0) {
std::memcpy(m_y, cur_block, size);
std::memcpy(m_y, cur_block, left);
}
}