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

Commit c1e93e7d authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Move more installd methods to Binder.

Test: builds, boots, apps install fine
Bug: 13758960, 30944031
Change-Id: I1fcaaaaad34c2f9a3d6a15443ef1764186669865
parent ecea1bfe
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -17,8 +17,22 @@
package android.os;

interface IInstalld {
    void createUserData(@nullable @utf8InCpp String uuid, int userId, int userSerial, int flags);
    void destroyUserData(@nullable @utf8InCpp String uuid, int userId, int flags);

    void createAppData(in @nullable @utf8InCpp String uuid, in @utf8InCpp String packageName,
            int userId, int flags, int appId, in @utf8InCpp String seInfo, int targetSdkVersion);
    void restoreconAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
            int userId, int flags, int appId, @utf8InCpp String seInfo);
    void migrateAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
            int userId, int flags);
    void clearAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
            int userId, int flags, long ceDataInode);
    void destroyAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
            int userId, int flags, long ceDataInode);
    long getAppDataInode(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
            int userId, int flags);

    void moveCompleteApp(@nullable @utf8InCpp String fromUuid, @nullable @utf8InCpp String toUuid,
            @utf8InCpp String packageName, @utf8InCpp String dataAppName, int appId,
            @utf8InCpp String seInfo, int targetSdkVersion);
+76 −47
Original line number Diff line number Diff line
@@ -298,21 +298,27 @@ binder::Status InstalldNativeService::createAppData(const std::unique_ptr<std::s
    return binder::Status::ok();
}

int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags) {
//int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags) {
binder::Status InstalldNativeService::migrateAppData(const std::unique_ptr<std::string>& uuid,
        const std::string& packageName, int32_t userId, int32_t flags) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    // This method only exists to upgrade system apps that have requested
    // forceDeviceEncrypted, so their default storage always lives in a
    // consistent location.  This only works on non-FBE devices, since we
    // never want to risk exposing data on a device with real CE/DE storage.

    auto ce_path = create_data_user_ce_package_path(uuid, userid, pkgname);
    auto de_path = create_data_user_de_package_path(uuid, userid, pkgname);
    auto ce_path = create_data_user_ce_package_path(uuid_, userId, pkgname);
    auto de_path = create_data_user_de_package_path(uuid_, userId, pkgname);

    // If neither directory is marked as default, assume CE is default
    if (getxattr(ce_path.c_str(), kXattrDefault, nullptr, 0) == -1
            && getxattr(de_path.c_str(), kXattrDefault, nullptr, 0) == -1) {
        if (setxattr(ce_path.c_str(), kXattrDefault, nullptr, 0, 0) != 0) {
            PLOG(ERROR) << "Failed to mark default storage " << ce_path;
            return -1;
            return binder::Status::fromServiceSpecificError(-1);
        }
    }

@@ -325,15 +331,15 @@ int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int
                << " is not active; migrating from " << source;
        if (delete_dir_contents_and_dir(target) != 0) {
            PLOG(ERROR) << "Failed to delete";
            return -1;
            return binder::Status::fromServiceSpecificError(-1);
        }
        if (rename(source.c_str(), target.c_str()) != 0) {
            PLOG(ERROR) << "Failed to rename";
            return -1;
            return binder::Status::fromServiceSpecificError(-1);
        }
    }

    return 0;
    return binder::Status::ok();
}

static bool clear_profile(const std::string& profile) {
@@ -408,11 +414,15 @@ int clear_app_profiles(const char* pkgname) {
    return success ? 0 : -1;
}

int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags,
        ino_t ce_data_inode) {
binder::Status InstalldNativeService::clearAppData(const std::unique_ptr<std::string>& uuid,
        const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    int res = 0;
    if (flags & FLAG_STORAGE_CE) {
        auto path = create_data_user_ce_package_path(uuid, userid, pkgname, ce_data_inode);
        auto path = create_data_user_ce_package_path(uuid_, userId, pkgname, ceDataInode);
        if (flags & FLAG_CLEAR_CACHE_ONLY) {
            path = read_path_inode(path, "cache", kXattrInodeCache);
        } else if (flags & FLAG_CLEAR_CODE_CACHE_ONLY) {
@@ -433,18 +443,18 @@ int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int f
            only_cache = true;
        }

        auto path = create_data_user_de_package_path(uuid, userid, pkgname) + suffix;
        auto path = create_data_user_de_package_path(uuid_, userId, pkgname) + suffix;
        if (access(path.c_str(), F_OK) == 0) {
            // TODO: include result once 25796509 is fixed
            delete_dir_contents(path);
        }
        if (!only_cache) {
            if (!clear_current_profile(pkgname, userid)) {
            if (!clear_current_profile(pkgname, userId)) {
                res |= -1;
            }
        }
    }
    return res;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

static int destroy_app_reference_profile(const char *pkgname) {
@@ -469,23 +479,27 @@ int destroy_app_profiles(const char *pkgname) {
    return result;
}

int destroy_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags,
        ino_t ce_data_inode) {
binder::Status InstalldNativeService::destroyAppData(const std::unique_ptr<std::string>& uuid,
        const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    int res = 0;
    if (flags & FLAG_STORAGE_CE) {
        res |= delete_dir_contents_and_dir(
                create_data_user_ce_package_path(uuid, userid, pkgname, ce_data_inode));
                create_data_user_ce_package_path(uuid_, userId, pkgname, ceDataInode));
    }
    if (flags & FLAG_STORAGE_DE) {
        res |= delete_dir_contents_and_dir(
                create_data_user_de_package_path(uuid, userid, pkgname));
        destroy_app_current_profiles(pkgname, userid);
                create_data_user_de_package_path(uuid_, userId, pkgname));
        destroy_app_current_profiles(pkgname, userId);
        // TODO(calin): If the package is still installed by other users it's probably
        // beneficial to keep the reference profile around.
        // Verify if it's ok to do that.
        destroy_app_reference_profile(pkgname);
    }
    return res;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std::string>& fromUuid,
@@ -497,7 +511,6 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std:
    const char* to_uuid = toUuid ? toUuid->c_str() : nullptr;
    const char* package_name = packageName.c_str();
    const char* data_app_name = dataAppName.c_str();
    const char* seinfo = seInfo.c_str();

    std::vector<userid_t> users = get_known_users(from_uuid);

@@ -587,8 +600,8 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std:
            }
        }

        if (restorecon_app_data(to_uuid, package_name, user, FLAG_STORAGE_CE | FLAG_STORAGE_DE,
                appId, seinfo) != 0) {
        if (!restoreconAppData(toUuid, packageName, user, FLAG_STORAGE_CE | FLAG_STORAGE_DE,
                appId, seInfo).isOk()) {
            LOG(ERROR) << "Failed to restorecon";
            goto fail;
        }
@@ -624,30 +637,36 @@ fail:
    return binder::Status::fromServiceSpecificError(-1);
}

int create_user_data(const char *uuid, userid_t userid, int user_serial ATTRIBUTE_UNUSED,
        int flags) {
binder::Status InstalldNativeService::createUserData(const std::unique_ptr<std::string>& uuid,
        int32_t userId, int32_t userSerial ATTRIBUTE_UNUSED, int32_t flags) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    int res = 0;
    if (flags & FLAG_STORAGE_DE) {
        if (uuid == nullptr) {
            return ensure_config_user_dirs(userid);
        if (uuid_ == nullptr) {
            res = ensure_config_user_dirs(userId);
        }
    }
    return 0;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

int destroy_user_data(const char *uuid, userid_t userid, int flags) {
binder::Status InstalldNativeService::destroyUserData(const std::unique_ptr<std::string>& uuid,
        int32_t userId, int32_t flags) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    int res = 0;
    if (flags & FLAG_STORAGE_DE) {
        res |= delete_dir_contents_and_dir(create_data_user_de_path(uuid, userid), true);
        if (uuid == nullptr) {
            res |= delete_dir_contents_and_dir(create_data_misc_legacy_path(userid), true);
            res |= delete_dir_contents_and_dir(create_data_user_profiles_path(userid), true);
        res |= delete_dir_contents_and_dir(create_data_user_de_path(uuid_, userId), true);
        if (uuid_ == nullptr) {
            res |= delete_dir_contents_and_dir(create_data_misc_legacy_path(userId), true);
            res |= delete_dir_contents_and_dir(create_data_user_profiles_path(userId), true);
        }
    }
    if (flags & FLAG_STORAGE_CE) {
        res |= delete_dir_contents_and_dir(create_data_user_ce_path(uuid, userid), true);
        res |= delete_dir_contents_and_dir(create_data_media_path(uuid, userid), true);
        res |= delete_dir_contents_and_dir(create_data_user_ce_path(uuid_, userId), true);
        res |= delete_dir_contents_and_dir(create_data_media_path(uuid_, userId), true);
    }
    return res;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

/* Try to ensure free_size bytes of storage are available.
@@ -784,12 +803,18 @@ int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, i
    return 0;
}

int get_app_data_inode(const char *uuid, const char *pkgname, int userid, int flags, ino_t *inode) {
binder::Status InstalldNativeService::getAppDataInode(const std::unique_ptr<std::string>& uuid,
    const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return) {
    ENFORCE_UID(AID_SYSTEM);
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    int res = 0;
    if (flags & FLAG_STORAGE_CE) {
        auto path = create_data_user_ce_package_path(uuid, userid, pkgname);
        return get_path_inode(path, inode);
        auto path = create_data_user_ce_package_path(uuid_, userId, pkgname);
        res = get_path_inode(path, reinterpret_cast<ino_t*>(_aidl_return));
    }
    return -1;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

static int split_count(const char *str)
@@ -2218,35 +2243,39 @@ fail:
    return -1;
}

int restorecon_app_data(const char* uuid, const char* pkgName, userid_t userid, int flags,
        appid_t appid, const char* seinfo) {
binder::Status InstalldNativeService::restoreconAppData(const std::unique_ptr<std::string>& uuid,
        const std::string& packageName, int32_t userId, int32_t flags, int32_t appId,
        const std::string& seInfo) {
    ENFORCE_UID(AID_SYSTEM);
    int res = 0;

    // SELINUX_ANDROID_RESTORECON_DATADATA flag is set by libselinux. Not needed here.
    unsigned int seflags = SELINUX_ANDROID_RESTORECON_RECURSE;
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgName = packageName.c_str();
    const char* seinfo = seInfo.c_str();

    if (!pkgName || !seinfo) {
        ALOGE("Package name or seinfo tag is null when trying to restorecon.");
        return -1;
        return binder::Status::fromServiceSpecificError(-1);
    }

    uid_t uid = multiuser_get_uid(userid, appid);
    uid_t uid = multiuser_get_uid(userId, appId);
    if (flags & FLAG_STORAGE_CE) {
        auto path = create_data_user_ce_package_path(uuid, userid, pkgName);
        auto path = create_data_user_ce_package_path(uuid_, userId, pkgName);
        if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, seflags) < 0) {
            PLOG(ERROR) << "restorecon failed for " << path;
            res = -1;
        }
    }
    if (flags & FLAG_STORAGE_DE) {
        auto path = create_data_user_de_package_path(uuid, userid, pkgName);
        auto path = create_data_user_de_package_path(uuid_, userId, pkgName);
        if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, seflags) < 0) {
            PLOG(ERROR) << "restorecon failed for " << path;
            // TODO: include result once 25796509 is fixed
        }
    }

    return res;
    return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok();
}

int create_oat_dir(const char* oat_dir, const char* instruction_set)
+17 −12
Original line number Diff line number Diff line
@@ -38,30 +38,35 @@ public:
    static char const* getServiceName() { return "installd"; }
    virtual status_t dump(int fd, const Vector<String16> &args) override;

    binder::Status createUserData(const std::unique_ptr<std::string>& uuid, int32_t userId,
            int32_t userSerial, int32_t flags);
    binder::Status destroyUserData(const std::unique_ptr<std::string>& uuid, int32_t userId,
            int32_t flags);

    binder::Status createAppData(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags, int32_t appId,
            const std::string& seInfo, int32_t targetSdkVersion);
    binder::Status restoreconAppData(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags, int32_t appId,
            const std::string& seInfo);
    binder::Status migrateAppData(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags);
    binder::Status clearAppData(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode);
    binder::Status destroyAppData(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode);
    binder::Status getAppDataInode(const std::unique_ptr<std::string>& uuid,
            const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return);

    binder::Status moveCompleteApp(const std::unique_ptr<std::string>& fromUuid,
            const std::unique_ptr<std::string>& toUuid, const std::string& packageName,
            const std::string& dataAppName, int32_t appId, const std::string& seInfo,
            int32_t targetSdkVersion);
};

int restorecon_app_data(const char* uuid, const char* pkgName, userid_t userid, int flags,
        appid_t appid, const char* seinfo);
int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags);
int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags,
        ino_t ce_data_inode);
int destroy_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags,
        ino_t ce_data_inode);

int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, ino_t ce_data_inode,
        const char* code_path, int64_t *codesize, int64_t *datasize, int64_t *cachesize,
        int64_t *asecsize);
int get_app_data_inode(const char *uuid, const char *pkgname, int userid, int flags, ino_t *inode);

int create_user_data(const char *uuid, userid_t userid, int user_serial, int flags);
int destroy_user_data(const char *uuid, userid_t userid, int flags);

int rm_dex(const char *path, const char *instruction_set);
int free_cache(const char *uuid, int64_t free_size);
+0 −54
Original line number Diff line number Diff line
@@ -188,27 +188,6 @@ static int do_ping(char **arg ATTRIBUTE_UNUSED, char reply[REPLY_MAX] ATTRIBUTE_
    return 0;
}

static int do_restorecon_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) {
    /* const char* uuid, const char* pkgName, userid_t userid, int flags,
            appid_t appid, const char* seinfo */
    return restorecon_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atoi(arg[4]), arg[5]);
}

static int do_migrate_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) {
    /* const char *uuid, const char *pkgname, userid_t userid, int flags */
    return migrate_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]));
}

static int do_clear_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) {
    /* const char *uuid, const char *pkgname, userid_t userid, int flags, ino_t ce_data_inode */
    return clear_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atol(arg[4]));
}

static int do_destroy_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) {
    /* const char *uuid, const char *pkgname, userid_t userid, int flags, ino_t ce_data_inode */
    return destroy_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atol(arg[4]));
}

// We use otapreopt_chroot to get into the chroot.
static constexpr const char* kOtaPreopt = "/system/bin/otapreopt_chroot";

@@ -335,29 +314,6 @@ static int do_get_app_size(char **arg, char reply[REPLY_MAX]) {
    return res;
}

static int do_get_app_data_inode(char **arg, char reply[REPLY_MAX]) {
    ino_t inode = 0;
    int res = 0;

    /* const char *uuid, const char *pkgname, int userid, int flags */
    res = get_app_data_inode(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), &inode);

    snprintf(reply, REPLY_MAX, "%" PRId64, (int64_t) inode);
    return res;
}

static int do_create_user_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED)
{
    /* const char *uuid, userid_t userid, int user_serial, int flags */
    return create_user_data(parse_null(arg[0]), atoi(arg[1]), atoi(arg[2]), atoi(arg[3]));
}

static int do_destroy_user_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED)
{
    /* const char *uuid, userid_t userid, int flags */
    return destroy_user_data(parse_null(arg[0]), atoi(arg[1]), atoi(arg[2]));
}

static int do_linklib(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED)
{
    return linklib(parse_null(arg[0]), arg[1], arg[2], atoi(arg[3]));
@@ -416,17 +372,7 @@ struct cmdinfo {

struct cmdinfo cmds[] = {
    { "ping",                 0, do_ping },

    { "restorecon_app_data",  6, do_restorecon_app_data },
    { "migrate_app_data",     4, do_migrate_app_data },
    { "clear_app_data",       5, do_clear_app_data },
    { "destroy_app_data",     5, do_destroy_app_data },
    { "get_app_size",         6, do_get_app_size },
    { "get_app_data_inode",   4, do_get_app_data_inode },

    { "create_user_data",     4, do_create_user_data },
    { "destroy_user_data",    3, do_destroy_user_data },

    { "dexopt",              10, do_dexopt },
    { "markbootcomplete",     1, do_mark_boot_complete },
    { "rmdex",                2, do_rm_dex },