Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 184dcb82 authored by Samiul Islam's avatar Samiul Islam Committed by Automerger Merge Worker
Browse files

Merge changes Ida831e19,I3b74e343,I966c76b0 am: 27223c51

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2006990

Change-Id: Ibab979da42a5b08b39dc2cb67b4752e4f5feaae6
parents 87f63f84 27223c51
Loading
Loading
Loading
Loading
+18 −18
Original line number Diff line number Diff line
@@ -723,10 +723,10 @@ binder::Status InstalldNativeService::createAppDataLocked(
    }

    // TODO(b/220095381): Due to boot time regression, we have omitted call to
    // createAppDirectoryForSupplementalData from here temporarily (unless it's for testing)
    // createSdkSandboxDataDirectory from here temporarily (unless it's for testing)
    if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) {
        auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId,
                                                            previousAppId, seInfo, flags);
        auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId,
                                                    seInfo, flags);
        if (!status.isOk()) {
            return status;
        }
@@ -736,15 +736,15 @@ binder::Status InstalldNativeService::createAppDataLocked(
}

/**
 * Responsible for creating /data/user/0/supplemental/<app-name> directory and other
 * Responsible for creating /data/misc_{ce|de}/user/0/sdksandbox/<app-name> directory and other
 * app level sub directories, such as ./shared
 */
binder::Status InstalldNativeService::createAppDirectoryForSupplementalData(
binder::Status InstalldNativeService::createSdkSandboxDataDirectory(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) {
    int32_t supplementalUid = multiuser_get_supplemental_uid(userId, appId);
    if (supplementalUid == -1) {
        // There no valid supplemental process for this app. Skip creation of data directory
    int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId);
    if (sdkSandboxUid == -1) {
        // There no valid sdk sandbox process for this app. Skip creation of data directory
        return ok();
    }

@@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData(
        }
        bool isCeData = (currentFlag == FLAG_STORAGE_CE);

        // /data/misc_{ce,de}/<user-id>/supplemental directory gets created by vold
        // /data/misc_{ce,de}/<user-id>/sdksandbox directory gets created by vold
        // during user creation

        // Prepare the app directory
        auto appPath = create_data_misc_supplemental_package_path(uuid_, isCeData, userId,
        auto appPath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId,
                                                                 packageName.c_str());
        if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) {
            return error("Failed to prepare " + appPath);
        }

        // Now prepare the shared directory which will be accessible by all codes
        auto sharedPath = create_data_misc_supplemental_shared_path(uuid_, isCeData, userId,
        auto sharedPath = create_data_misc_sdk_sandbox_shared_path(uuid_, isCeData, userId,
                                                                   packageName.c_str());

        int32_t previousSupplementalUid = multiuser_get_supplemental_uid(userId, previousAppId);
        int32_t previousSdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, previousAppId);
        int32_t cacheGid = multiuser_get_cache_gid(userId, appId);
        if (cacheGid == -1) {
            return exception(binder::Status::EX_ILLEGAL_STATE,
                             StringPrintf("cacheGid cannot be -1 for supplemental data"));
                             StringPrintf("cacheGid cannot be -1 for sdksandbox data"));
        }
        auto status = createAppDataDirs(sharedPath, supplementalUid, &previousSupplementalUid,
                                        cacheGid, seInfo, 0700);
        auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid,
                                        seInfo, 0700);
        if (!status.isOk()) {
            return status;
        }

        // TODO(b/211763739): We also need to handle art profile creations

        // TODO(b/211763739): And return the CE inode of the supplemental root directory and
        // TODO(b/211763739): And return the CE inode of the sdksandbox root directory and
        // app directory under it so we can clear contents while CE storage is locked
    }

+4 −5
Original line number Diff line number Diff line
@@ -204,10 +204,9 @@ private:
                                       const std::string& seInfo, int32_t targetSdkVersion,
                                       int64_t* _aidl_return);

    binder::Status createAppDirectoryForSupplementalData(const std::optional<std::string>& uuid,
                                                         const std::string& packageName,
                                                         int32_t userId, int32_t appId,
                                                         int32_t previousAppId,
    binder::Status createSdkSandboxDataDirectory(const std::optional<std::string>& uuid,
                                                 const std::string& packageName, int32_t userId,
                                                 int32_t appId, int32_t previousAppId,
                                                 const std::string& seInfo, int32_t flags);
};

+19 −21
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ static constexpr const int32_t kTestUserId = 0;
static constexpr const uid_t kTestAppId = 19999;

const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId);
const uid_t kTestAppSupplementalUid = multiuser_get_supplemental_uid(kTestUserId, kTestAppId);
const uid_t kTestSdkSandboxUid = multiuser_get_sdk_sandbox_uid(kTestUserId, kTestAppId);

#define FLAG_FORCE InstalldNativeService::FLAG_FORCE

@@ -949,7 +949,7 @@ TEST_F(AppDataSnapshotTest, RestoreAppDataSnapshot_WrongVolumeUuid) {
          "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE));
}

class AppSupplementalDataTest : public testing::Test {
class SdkSandboxDataTest : public testing::Test {
public:
    void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) {
        const auto fullPath = "/data/local/tmp/" + path;
@@ -986,8 +986,8 @@ protected:
        clearAppData();
        ASSERT_TRUE(mkdirs("/data/local/tmp/user/0", 0700));
        ASSERT_TRUE(mkdirs("/data/local/tmp/user_de/0", 0700));
        ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/supplemental", 0700));
        ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/supplemental", 0700));
        ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/sdksandbox", 0700));
        ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/sdksandbox", 0700));

        init_globals_from_data_and_root();
    }
@@ -1006,7 +1006,7 @@ private:
    }
};

TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) {
TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData) {
    android::os::CreateAppDataResult result;
    android::os::CreateAppDataArgs args = createAppDataArgs();
    args.packageName = "com.foo";
@@ -1015,24 +1015,22 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) {
    // Create the app user data.
    ASSERT_BINDER_SUCCESS(service->createAppData(args, &result));

    CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid,
                    S_IFDIR | 0700);
    CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid,
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700);
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid,
                    S_IFDIR | S_ISGID | 0771);
    CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid,
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid,
                    S_IFDIR | S_ISGID | 0771);

    CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid,
                    S_IFDIR | 0700);
    CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid,
    CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700);
    CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid,
                    S_IFDIR | S_ISGID | 0771);
    CheckFileAccess("misc_de/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid,
    CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid,
                    S_IFDIR | S_ISGID | 0771);
}

TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) {
TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) {
    android::os::CreateAppDataResult result;
    android::os::CreateAppDataArgs args = createAppDataArgs();
    args.packageName = "com.foo";
@@ -1042,13 +1040,13 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without
    ASSERT_BINDER_SUCCESS(service->createAppData(args, &result));

    // Only CE paths should exist
    CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);

    // DE paths should not exist
    ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/supplemental/com.foo"));
    ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/sdksandbox/com.foo"));
}

TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) {
TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) {
    android::os::CreateAppDataResult result;
    android::os::CreateAppDataArgs args = createAppDataArgs();
    args.packageName = "com.foo";
@@ -1058,10 +1056,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without
    ASSERT_BINDER_SUCCESS(service->createAppData(args, &result));

    // CE paths should not exist
    ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/supplemental/com.foo"));
    ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/sdksandbox/com.foo"));

    // Only DE paths should exist
    CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);
}

}  // namespace installd
+25 −27
Original line number Diff line number Diff line
@@ -658,38 +658,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) {
    ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700));
}

TEST_F(UtilsTest, TestSupplementalDataPaths) {
TEST_F(UtilsTest, TestSdkSandboxDataPaths) {
    // Ce data paths
    EXPECT_EQ("/data/misc_ce/0/supplemental",
              create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0));
    EXPECT_EQ("/data/misc_ce/10/supplemental",
              create_data_misc_supplemental_path(nullptr, true, 10));
    EXPECT_EQ("/data/misc_ce/0/sdksandbox",
              create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0));
    EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10));

    EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo",
              create_data_misc_supplemental_package_path(nullptr, true, 0, "com.foo"));
    EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo",
              create_data_misc_supplemental_package_path(nullptr, true, 10, "com.foo"));
    EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo",
              create_data_misc_sdk_sandbox_package_path(nullptr, true, 0, "com.foo"));
    EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo",
              create_data_misc_sdk_sandbox_package_path(nullptr, true, 10, "com.foo"));

    EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo/shared",
              create_data_misc_supplemental_shared_path(nullptr, true, 0, "com.foo"));
    EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo/shared",
              create_data_misc_supplemental_shared_path(nullptr, true, 10, "com.foo"));
    EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo/shared",
              create_data_misc_sdk_sandbox_shared_path(nullptr, true, 0, "com.foo"));
    EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo/shared",
              create_data_misc_sdk_sandbox_shared_path(nullptr, true, 10, "com.foo"));

    // De data paths
    EXPECT_EQ("/data/misc_de/0/supplemental",
              create_data_misc_supplemental_path(nullptr, /*isCeData=*/false, 0));
    EXPECT_EQ("/data/misc_de/10/supplemental",
              create_data_misc_supplemental_path(nullptr, false, 10));

    EXPECT_EQ("/data/misc_de/0/supplemental/com.foo",
              create_data_misc_supplemental_package_path(nullptr, false, 0, "com.foo"));
    EXPECT_EQ("/data/misc_de/10/supplemental/com.foo",
              create_data_misc_supplemental_package_path(nullptr, false, 10, "com.foo"));

    EXPECT_EQ("/data/misc_de/0/supplemental/com.foo/shared",
              create_data_misc_supplemental_shared_path(nullptr, false, 0, "com.foo"));
    EXPECT_EQ("/data/misc_de/10/supplemental/com.foo/shared",
              create_data_misc_supplemental_shared_path(nullptr, false, 10, "com.foo"));
    EXPECT_EQ("/data/misc_de/0/sdksandbox",
              create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/false, 0));
    EXPECT_EQ("/data/misc_de/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, false, 10));

    EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo",
              create_data_misc_sdk_sandbox_package_path(nullptr, false, 0, "com.foo"));
    EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo",
              create_data_misc_sdk_sandbox_package_path(nullptr, false, 10, "com.foo"));

    EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo/shared",
              create_data_misc_sdk_sandbox_shared_path(nullptr, false, 0, "com.foo"));
    EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo/shared",
              create_data_misc_sdk_sandbox_shared_path(nullptr, false, 10, "com.foo"));
}

TEST_F(UtilsTest, WaitChild) {
+14 −14
Original line number Diff line number Diff line
@@ -198,38 +198,38 @@ std::string create_data_user_de_path(const char* volume_uuid, userid_t userid) {
}

/**
 * Create the path name where supplemental data for all apps will be stored.
 * E.g. /data/misc_ce/0/supplemental
 * Create the path name where sdk_sandbox data for all apps will be stored.
 * E.g. /data/misc_ce/0/sdksandbox
 */
std::string create_data_misc_supplemental_path(const char* uuid, bool isCeData, userid_t user) {
std::string create_data_misc_sdk_sandbox_path(const char* uuid, bool isCeData, userid_t user) {
    std::string data(create_data_path(uuid));
    if (isCeData) {
        return StringPrintf("%s/misc_ce/%d/supplemental", data.c_str(), user);
        return StringPrintf("%s/misc_ce/%d/sdksandbox", data.c_str(), user);
    } else {
        return StringPrintf("%s/misc_de/%d/supplemental", data.c_str(), user);
        return StringPrintf("%s/misc_de/%d/sdksandbox", data.c_str(), user);
    }
}

/**
 * Create the path name where code data for all codes in a particular app will be stored.
 * E.g. /data/misc_ce/0/supplemental/<app-name>
 * E.g. /data/misc_ce/0/sdksandbox/<app-name>
 */
std::string create_data_misc_supplemental_package_path(const char* volume_uuid, bool isCeData,
std::string create_data_misc_sdk_sandbox_package_path(const char* volume_uuid, bool isCeData,
                                                      userid_t user, const char* package_name) {
    check_package_name(package_name);
    return StringPrintf("%s/%s",
                        create_data_misc_supplemental_path(volume_uuid, isCeData, user).c_str(),
                        create_data_misc_sdk_sandbox_path(volume_uuid, isCeData, user).c_str(),
                        package_name);
}

/**
 * Create the path name where shared code data for a particular app will be stored.
 * E.g. /data/misc_ce/0/supplemental/<app-name>/shared
 * E.g. /data/misc_ce/0/sdksandbox/<app-name>/shared
 */
std::string create_data_misc_supplemental_shared_path(const char* volume_uuid, bool isCeData,
std::string create_data_misc_sdk_sandbox_shared_path(const char* volume_uuid, bool isCeData,
                                                     userid_t user, const char* package_name) {
    return StringPrintf("%s/shared",
                        create_data_misc_supplemental_package_path(volume_uuid, isCeData, user,
                        create_data_misc_sdk_sandbox_package_path(volume_uuid, isCeData, user,
                                                                  package_name)
                                .c_str());
}
Loading