mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-30 01:01:21 +00:00
appcontent: reject duplicate mounts without transferring ownership
This commit is contained in:
1 parent
15452a5fee
commit
97bef2992f
2 files changed
+7
-9
No files matched your search
@@ -32,6 +32,7 @@ namespace AppContent {
|
|||||||
|
|
||||||
constexpr uint32_t APP_CONTENT_APPPARAM_SKU_FLAG_FULL = 3;
|
constexpr uint32_t APP_CONTENT_APPPARAM_SKU_FLAG_FULL = 3;
|
||||||
constexpr int APP_CONTENT_ERROR_PARAMETER = -2133262334; /* 0x80D90002 */
|
constexpr int APP_CONTENT_ERROR_PARAMETER = -2133262334; /* 0x80D90002 */
|
||||||
|
constexpr int APP_CONTENT_ERROR_BUSY = -2133262333; /* 0x80D90003 */
|
||||||
constexpr int APP_CONTENT_ERROR_NOT_MOUNTED = -2133262332; /* 0x80D90004 */
|
constexpr int APP_CONTENT_ERROR_NOT_MOUNTED = -2133262332; /* 0x80D90004 */
|
||||||
constexpr int APP_CONTENT_ERROR_NOT_FOUND = -2133262331; /* 0x80D90005 */
|
constexpr int APP_CONTENT_ERROR_NOT_FOUND = -2133262331; /* 0x80D90005 */
|
||||||
constexpr int APP_CONTENT_ERROR_MOUNT_FULL = -2133262330; /* 0x80D90006 */
|
constexpr int APP_CONTENT_ERROR_MOUNT_FULL = -2133262330; /* 0x80D90006 */
|
||||||
@@ -210,10 +211,8 @@ int KYTY_SYSV_ABI AppContentAddcontMount(uint32_t servic
|
|||||||
|
|
||||||
for (const auto& m: g_addcont_mounts) {
|
for (const auto& m: g_addcont_mounts) {
|
||||||
if (m.label == entry->entitlement_label) {
|
if (m.label == entry->entitlement_label) {
|
||||||
const auto guest_point = m.point.substr(0, m.point.size() - 1);
|
LOGF("\t already mounted %s\n", m.point.c_str());
|
||||||
std::strncpy(mount_point->data, guest_point.c_str(), sizeof(mount_point->data) - 1);
|
return APP_CONTENT_ERROR_BUSY;
|
||||||
LOGF("\t already mounted %s\n", guest_point.c_str());
|
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -577,17 +577,16 @@ void TestAddContent(const std::filesystem::path& root) {
|
|||||||
Check(mount(0, &info[3].label, &point) == OK &&
|
Check(mount(0, &info[3].label, &point) == OK &&
|
||||||
!std::string_view(point.data).ends_with('/'),
|
!std::string_view(point.data).ends_with('/'),
|
||||||
"mount owned add-on without trailing slash");
|
"mount owned add-on without trailing slash");
|
||||||
|
MountPoint repeated {};
|
||||||
|
Check(mount(0, &info[3].label, &repeated) == static_cast<int>(0x80d90003u),
|
||||||
|
"duplicate mount reports BUSY");
|
||||||
const std::string mounted_file = std::string(point.data) + "/payload.txt";
|
const std::string mounted_file = std::string(point.data) + "/payload.txt";
|
||||||
const int fd = FileSystem::KernelOpen(mounted_file.c_str(), 0, 0);
|
const int fd = FileSystem::KernelOpen(mounted_file.c_str(), 0, 0);
|
||||||
std::array<char, 11> payload {};
|
std::array<char, 11> payload {};
|
||||||
Check(fd >= 3 && FileSystem::KernelRead(fd, payload.data(), payload.size()) == payload.size() &&
|
Check(fd >= 3 && FileSystem::KernelRead(fd, payload.data(), payload.size()) == payload.size() &&
|
||||||
std::string_view(payload.data(), payload.size()) == "DLC payload" &&
|
std::string_view(payload.data(), payload.size()) == "DLC payload" &&
|
||||||
FileSystem::KernelClose(fd) == OK,
|
FileSystem::KernelClose(fd) == OK,
|
||||||
"guest reads files from the selected title's add-on");
|
"guest reads the original mount after a rejected duplicate mount");
|
||||||
MountPoint repeated {};
|
|
||||||
Check(mount(0, &info[3].label, &repeated) == OK &&
|
|
||||||
std::strcmp(repeated.data, point.data) == 0,
|
|
||||||
"duplicate mount returns the same mount point");
|
|
||||||
Check(unmount(&point) == OK && FileSystem::GetRealFilename(mounted_file).empty() &&
|
Check(unmount(&point) == OK && FileSystem::GetRealFilename(mounted_file).empty() &&
|
||||||
unmount(&point) == static_cast<int>(0x80d90004u),
|
unmount(&point) == static_cast<int>(0x80d90004u),
|
||||||
"unmount removes mapping and repeated unmount reports NOT_MOUNTED");
|
"unmount removes mapping and repeated unmount reports NOT_MOUNTED");
|
||||||
|
|||||||
Reference in new issue
Block a user