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

Commit 4ee18ae8 authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

Rename SupplementalProcess to SdkSandbox

Ignore-AOSP-First: code is not in AOSP yet
Bug: 220320098
Test: presubmit
Change-Id: Ida831e19203181f9e59eb447f4d03fac683e1019
parent 7e6544bd
Loading
Loading
Loading
Loading
+18 −18
Original line number Original line 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
    // 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) {
    if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) {
        auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId,
        auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId,
                                                            previousAppId, seInfo, flags);
                                                    seInfo, flags);
        if (!status.isOk()) {
        if (!status.isOk()) {
            return status;
            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
 * 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,
        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 appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) {
    int32_t supplementalUid = multiuser_get_supplemental_uid(userId, appId);
    int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId);
    if (supplementalUid == -1) {
    if (sdkSandboxUid == -1) {
        // There no valid supplemental process for this app. Skip creation of data directory
        // There no valid sdk sandbox process for this app. Skip creation of data directory
        return ok();
        return ok();
    }
    }


@@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData(
        }
        }
        bool isCeData = (currentFlag == FLAG_STORAGE_CE);
        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
        // during user creation


        // Prepare the app directory
        // 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());
                                                                 packageName.c_str());
        if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) {
        if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) {
            return error("Failed to prepare " + appPath);
            return error("Failed to prepare " + appPath);
        }
        }


        // Now prepare the shared directory which will be accessible by all codes
        // 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());
                                                                   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);
        int32_t cacheGid = multiuser_get_cache_gid(userId, appId);
        if (cacheGid == -1) {
        if (cacheGid == -1) {
            return exception(binder::Status::EX_ILLEGAL_STATE,
            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,
        auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid,
                                        cacheGid, seInfo, 0700);
                                        seInfo, 0700);
        if (!status.isOk()) {
        if (!status.isOk()) {
            return status;
            return status;
        }
        }


        // TODO(b/211763739): We also need to handle art profile creations
        // 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
        // app directory under it so we can clear contents while CE storage is locked
    }
    }


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


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


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


const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId);
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
#define FLAG_FORCE InstalldNativeService::FLAG_FORCE


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


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


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


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


    CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid,
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700);
                    S_IFDIR | 0700);
    CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid,
    CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid,
                    S_IFDIR | S_ISGID | 0771);
                    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);
                    S_IFDIR | S_ISGID | 0771);


    CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751);
    CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid,
    CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700);
                    S_IFDIR | 0700);
    CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid,
    CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid,
                    S_IFDIR | S_ISGID | 0771);
                    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);
                    S_IFDIR | S_ISGID | 0771);
}
}


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


    // Only CE paths should exist
    // 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
    // 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::CreateAppDataResult result;
    android::os::CreateAppDataArgs args = createAppDataArgs();
    android::os::CreateAppDataArgs args = createAppDataArgs();
    args.packageName = "com.foo";
    args.packageName = "com.foo";
@@ -1045,10 +1043,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without
    ASSERT_BINDER_SUCCESS(service->createAppData(args, &result));
    ASSERT_BINDER_SUCCESS(service->createAppData(args, &result));


    // CE paths should not exist
    // 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
    // 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
}  // namespace installd
+25 −27
Original line number Original line Diff line number Diff line
@@ -656,38 +656,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) {
    ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700));
    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
    // Ce data paths
    EXPECT_EQ("/data/misc_ce/0/supplemental",
    EXPECT_EQ("/data/misc_ce/0/sdksandbox",
              create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0));
              create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0));
    EXPECT_EQ("/data/misc_ce/10/supplemental",
    EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10));
              create_data_misc_supplemental_path(nullptr, true, 10));


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


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


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


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


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


}  // namespace installd
}  // namespace installd
+14 −14
Original line number Original line Diff line number Diff line
@@ -195,38 +195,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.
 * Create the path name where sdk_sandbox data for all apps will be stored.
 * E.g. /data/misc_ce/0/supplemental
 * 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));
    std::string data(create_data_path(uuid));
    if (isCeData) {
    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 {
    } 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.
 * 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) {
                                                      userid_t user, const char* package_name) {
    check_package_name(package_name);
    check_package_name(package_name);
    return StringPrintf("%s/%s",
    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);
                        package_name);
}
}


/**
/**
 * Create the path name where shared code data for a particular app will be stored.
 * 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) {
                                                     userid_t user, const char* package_name) {
    return StringPrintf("%s/shared",
    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)
                                                                  package_name)
                                .c_str());
                                .c_str());
}
}
Loading