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

Commit 87692440 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "[installd] return deDataInode in the createAppData result" into main...

Merge "[installd] return deDataInode in the createAppData result" into main am: 404ab53d am: 51464ffa

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



Change-Id: I6bd19a09e1f6a9d8942ad15009324d4aa30f7966
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3a7360d7 51464ffa
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -757,7 +757,7 @@ static binder::Status createAppDataDirs(const std::string& path, int32_t uid, in
binder::Status InstalldNativeService::createAppDataLocked(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo,
        int32_t targetSdkVersion, int64_t* _aidl_return) {
        int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) {
    ENFORCE_UID(AID_SYSTEM);
    ENFORCE_VALID_USER(userId);
    CHECK_ARGUMENT_UUID(uuid);
@@ -767,7 +767,8 @@ binder::Status InstalldNativeService::createAppDataLocked(
    const char* pkgname = packageName.c_str();

    // Assume invalid inode unless filled in below
    if (_aidl_return != nullptr) *_aidl_return = -1;
    if (ceDataInode != nullptr) *ceDataInode = -1;
    if (deDataInode != nullptr) *deDataInode = -1;

    int32_t uid = multiuser_get_uid(userId, appId);

@@ -805,12 +806,12 @@ binder::Status InstalldNativeService::createAppDataLocked(

        // And return the CE inode of the top-level data directory so we can
        // clear contents while CE storage is locked
        if (_aidl_return != nullptr) {
        if (ceDataInode != nullptr) {
            ino_t result;
            if (get_path_inode(path, &result) != 0) {
                return error("Failed to get_path_inode for " + path);
            }
            *_aidl_return = static_cast<uint64_t>(result);
            *ceDataInode = static_cast<uint64_t>(result);
        }
    }
    if (flags & FLAG_STORAGE_DE) {
@@ -829,6 +830,14 @@ binder::Status InstalldNativeService::createAppDataLocked(
        if (!prepare_app_profile_dir(packageName, appId, userId)) {
            return error("Failed to prepare profiles for " + packageName);
        }

        if (deDataInode != nullptr) {
            ino_t result;
            if (get_path_inode(path, &result) != 0) {
                return error("Failed to get_path_inode for " + path);
            }
            *deDataInode = static_cast<uint64_t>(result);
        }
    }

    if (flags & FLAG_STORAGE_SDK) {
@@ -892,14 +901,14 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory(
binder::Status InstalldNativeService::createAppData(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo,
        int32_t targetSdkVersion, int64_t* _aidl_return) {
        int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) {
    ENFORCE_UID(AID_SYSTEM);
    ENFORCE_VALID_USER(userId);
    CHECK_ARGUMENT_UUID(uuid);
    CHECK_ARGUMENT_PACKAGE_NAME(packageName);
    LOCK_PACKAGE_USER();
    return createAppDataLocked(uuid, packageName, userId, flags, appId, previousAppId, seInfo,
                               targetSdkVersion, _aidl_return);
                               targetSdkVersion, ceDataInode, deDataInode);
}

binder::Status InstalldNativeService::createAppData(
@@ -910,9 +919,12 @@ binder::Status InstalldNativeService::createAppData(
    // Locking is performed depeer in the callstack.

    int64_t ceDataInode = -1;
    int64_t deDataInode = -1;
    auto status = createAppData(args.uuid, args.packageName, args.userId, args.flags, args.appId,
            args.previousAppId, args.seInfo, args.targetSdkVersion, &ceDataInode);
                                args.previousAppId, args.seInfo, args.targetSdkVersion,
                                &ceDataInode, &deDataInode);
    _aidl_return->ceDataInode = ceDataInode;
    _aidl_return->deDataInode = deDataInode;
    _aidl_return->exceptionCode = status.exceptionCode();
    _aidl_return->exceptionMessage = status.exceptionMessage();
    return ok();
@@ -1839,7 +1851,8 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::optional<std::s
        }

        if (!createAppDataLocked(toUuid, packageName, userId, FLAG_STORAGE_CE | FLAG_STORAGE_DE,
                                 appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr)
                                 appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr,
                                 nullptr)
                     .isOk()) {
            res = error("Failed to create package target");
            goto fail;
+3 −2
Original line number Diff line number Diff line
@@ -68,7 +68,8 @@ public:
    binder::Status createAppData(const std::optional<std::string>& uuid,
                                 const std::string& packageName, int32_t userId, int32_t flags,
                                 int32_t appId, int32_t previousAppId, const std::string& seInfo,
                                 int32_t targetSdkVersion, int64_t* _aidl_return);
                                 int32_t targetSdkVersion, int64_t* ceDataInode,
                                 int64_t* deDataInode);

    binder::Status createAppData(
            const android::os::CreateAppDataArgs& args,
@@ -238,7 +239,7 @@ private:
                                       const std::string& packageName, int32_t userId,
                                       int32_t flags, int32_t appId, int32_t previousAppId,
                                       const std::string& seInfo, int32_t targetSdkVersion,
                                       int64_t* _aidl_return);
                                       int64_t* ceDataInode, int64_t* deDataInode);
    binder::Status restoreconAppDataLocked(const std::optional<std::string>& uuid,
                                           const std::string& packageName, int32_t userId,
                                           int32_t flags, int32_t appId, const std::string& seInfo);
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.os;
/** {@hide} */
parcelable CreateAppDataResult {
    long ceDataInode;
    long deDataInode;
    int exceptionCode;
    @utf8InCpp String exceptionMessage;
}
+14 −30
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ protected:
    std::string app_oat_dir_;

    int64_t ce_data_inode_;
    int64_t de_data_inode_;

    std::string secondary_dex_ce_;
    std::string secondary_dex_ce_link_;
@@ -261,16 +262,10 @@ protected:
        }

        // Create the app user data.
        binder::Status status = service_->createAppData(
                volume_uuid_,
                package_name_,
                kTestUserId,
                kAppDataFlags,
                kTestAppUid,
                0 /* previousAppId */,
                se_info_,
                kOSdkVersion,
                &ce_data_inode_);
        binder::Status status =
                service_->createAppData(volume_uuid_, package_name_, kTestUserId, kAppDataFlags,
                                        kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion,
                                        &ce_data_inode_, &de_data_inode_);
        if (!status.isOk()) {
            return ::testing::AssertionFailure() << "Could not create app data: "
                                                 << status.toString8().c_str();
@@ -1350,16 +1345,10 @@ TEST_F(ProfileTest, ProfileDirOkAfterFixup) {
    ASSERT_EQ(0, chmod(ref_profile_dir.c_str(), 0700));

    // Run createAppData again which will offer to fix-up the profile directories.
    ASSERT_BINDER_SUCCESS(service_->createAppData(
            volume_uuid_,
            package_name_,
            kTestUserId,
            kAppDataFlags,
            kTestAppUid,
            0 /* previousAppId */,
            se_info_,
            kOSdkVersion,
            &ce_data_inode_));
    ASSERT_BINDER_SUCCESS(service_->createAppData(volume_uuid_, package_name_, kTestUserId,
                                                  kAppDataFlags, kTestAppUid, 0 /* previousAppId */,
                                                  se_info_, kOSdkVersion, &ce_data_inode_,
                                                  &de_data_inode_));

    // Check the file access.
    CheckFileAccess(cur_profile_dir, kTestAppUid, kTestAppUid, 0700 | S_IFDIR);
@@ -1492,18 +1481,13 @@ class BootProfileTest : public ProfileTest {
    void createAppProfilesForBootMerge(size_t number_of_profiles) {
        for (size_t i = 0; i < number_of_profiles; i++) {
            int64_t ce_data_inode;
            int64_t de_data_inode;
            std::string package_name = "dummy_test_pkg" + std::to_string(i);
            LOG(INFO) << package_name;
            ASSERT_BINDER_SUCCESS(service_->createAppData(
                    volume_uuid_,
                    package_name,
                    kTestUserId,
                    kAppDataFlags,
                    kTestAppUid,
                    0 /* previousAppId */,
                    se_info_,
                    kOSdkVersion,
                    &ce_data_inode));
            ASSERT_BINDER_SUCCESS(
                    service_->createAppData(volume_uuid_, package_name, kTestUserId, kAppDataFlags,
                                            kTestAppUid, 0 /* previousAppId */, se_info_,
                                            kOSdkVersion, &ce_data_inode, &de_data_inode));
            extra_apps_.push_back(package_name);
            extra_ce_data_inodes_.push_back(ce_data_inode);
            std::string profile = create_current_profile_path(