diff --git a/services/bundlemgr/include/installd/installd_operator.h b/services/bundlemgr/include/installd/installd_operator.h index 73de3badb3e93dff2a3144536ee4235165271741..7aaaffdf1f83d1b4b133747110c540d8d26132cd 100644 --- a/services/bundlemgr/include/installd/installd_operator.h +++ b/services/bundlemgr/include/installd/installd_operator.h @@ -231,6 +231,8 @@ public: static bool SetProjectIdForDir(const std::string &path, uint32_t projectId); + static bool HasProjectIdForDir(const std::string &path); + static int64_t GetProjectUsage(uint32_t projectId); static bool ScanDir( diff --git a/services/bundlemgr/src/installd/installd_host_impl.cpp b/services/bundlemgr/src/installd/installd_host_impl.cpp index 5039de809487942557108a60b70a8e19eb26e767..b1e31cafdfb234c5c178430bd8ea65225de92612 100644 --- a/services/bundlemgr/src/installd/installd_host_impl.cpp +++ b/services/bundlemgr/src/installd/installd_host_impl.cpp @@ -1324,6 +1324,10 @@ int64_t InstalldHostImpl::GetEl2CacheSize(const int32_t projectId, const std::st LOG_I(BMS_TAG_INSTALLD, "%{public}s el2 cache dir empty", bundleNameDir.c_str()); return 0; } + if (!InstalldOperator::HasProjectIdForDir(cachePath)) { + LOG_I(BMS_TAG_INSTALLD, "%{public}s has no project id", bundleNameDir.c_str()); + return InstalldOperator::GetDiskUsage(cachePath); + } // quota result contains the size of base dir int64_t projectQuotaSize = InstalldOperator::GetProjectUsage(projectId) - EMPTY_FILE_SIZE; if (projectQuotaSize >= 0) { diff --git a/services/bundlemgr/src/installd/installd_operator.cpp b/services/bundlemgr/src/installd/installd_operator.cpp index 0e02903cdafe35b1e757a65017df1522b8a45b5d..851812cb2cae71ddbb7e101cef04ce08ddff9cf6 100644 --- a/services/bundlemgr/src/installd/installd_operator.cpp +++ b/services/bundlemgr/src/installd/installd_operator.cpp @@ -1264,6 +1264,29 @@ bool InstalldOperator::SetProjectIdForDir(const std::string &path, uint32_t proj return true; } +bool InstalldOperator::HasProjectIdForDir(const std::string &path) +{ + std::string realPath; + if (!PathToRealPath(path, realPath)) { + LOG_E(BMS_TAG_INSTALLD, "path(%{public}s) is not real path", path.c_str()); + return false; + } + int32_t fd = open(realPath.c_str(), O_RDONLY | O_DIRECTORY); + if (fd < 0) { + LOG_E(BMS_TAG_INSTALLD, "Failed to open directory: %{public}s, errno: %{public}d", realPath.c_str(), errno); + return false; + } + + struct fsxattr fsx; + if (ioctl(fd, FS_IOC_FSGETXATTR, &fsx) < 0) { + LOG_W(BMS_TAG_INSTALLD, "Failed to get fsxattr for %{public}s, errno: %{public}d", path.c_str(), errno); + close(fd); + return false; + } + close(fd); + return (fsx.fsx_xflags & FS_XFLAG_PROJINHERIT) != 0; +} + int64_t InstalldOperator::GetProjectUsage(uint32_t projectId) { std::lock_guard lock(mMountsLock); diff --git a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp index 6d6c66bda027bfa5669152eb18f65c7b9cb1029d..7fb1fa635be1ac504d02a88f455279a3d9c4c74b 100755 --- a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp +++ b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp @@ -2367,4 +2367,22 @@ HWTEST_F(BmsInstallDaemonOperatorTest, InstalldOperatorTest_14000, Function | Sm "/data/app/el1/100/base/InstalldOperatorTest_14000/test1.txt", 14000)); EXPECT_TRUE(InstalldOperator::DeleteDir("/data/app/el1/100/base/InstalldOperatorTest_14000")); } + +/** + * @tc.number: InstalldOperatorTest_14100 + * @tc.name: test function of InstalldOperator + * @tc.desc: 1. calling HasProjectIdForDir and GetProjectUsage of InstalldOperator + */ +HWTEST_F(BmsInstallDaemonOperatorTest, InstalldOperatorTest_14100, Function | SmallTest | Level0) +{ + EXPECT_FALSE(InstalldOperator::HasProjectIdForDir("/invalid/path")); + + EXPECT_TRUE(InstalldOperator::MkRecursiveDir("/data/app/el1/100/base/InstalldOperatorTest_14100", true)); + EXPECT_FALSE(InstalldOperator::HasProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); + + EXPECT_TRUE(InstalldOperator::SetProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100", 14000)); + EXPECT_TRUE(InstalldOperator::HasProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); + + EXPECT_TRUE(InstalldOperator::DeleteDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp index 20edabf71de8e7ca1d7b7e47af4bf91bce4a82cb..29f1008ea0a52575d6f42b95ca4199db806ddf82 100644 --- a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp +++ b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp @@ -984,7 +984,7 @@ HWTEST_F(BmsInstallDaemonTest, GetBundleStats_0400, Function | SmallTest | Level EXPECT_NE(stats[1], 0); EXPECT_EQ(stats[2], 0); // distributed file does not exist EXPECT_EQ(stats[3], 0); - EXPECT_NE(stats[4], 0); + EXPECT_EQ(stats[4], 0); OHOS::ForceRemoveDirectory(BUNDLE_DATA_DIR_CACHE); OHOS::ForceRemoveDirectory(BUNDLE_DATA_DIR_TEMP); OHOS::ForceRemoveDirectory(BUNDLE_CODE_DIR_CODE);