diff --git a/Source/Core/Core/IOS/FS/HostBackend/FS.cpp b/Source/Core/Core/IOS/FS/HostBackend/FS.cpp index 1a364436af..fea5d16261 100644 --- a/Source/Core/Core/IOS/FS/HostBackend/FS.cpp +++ b/Source/Core/Core/IOS/FS/HostBackend/FS.cpp @@ -610,10 +610,30 @@ Result HostFileSystem::GetMetadata(Uid uid, Gid gid, const std::string } ResultCode HostFileSystem::SetMetadata(Uid caller_uid, const std::string& path, Uid uid, Gid gid, - FileAttribute, Modes) + FileAttribute attr, Modes modes) { if (!IsValidPath(path)) return ResultCode::Invalid; + + FstEntry* entry = GetFstEntryForPath(path); + if (!entry) + return ResultCode::NotFound; + + if (caller_uid != 0 && caller_uid != entry->data.uid) + return ResultCode::AccessDenied; + if (caller_uid != 0 && uid != entry->data.uid) + return ResultCode::AccessDenied; + + const bool is_empty = File::GetSize(BuildFilename(path)) == 0; + if (entry->data.uid != uid && entry->data.is_file && !is_empty) + return ResultCode::FileNotEmpty; + + entry->data.gid = gid; + entry->data.uid = uid; + entry->data.attribute = attr; + entry->data.modes = modes; + SaveFst(); + return ResultCode::Success; }