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

Commit 65fe5dfd authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android Git Automerger
Browse files

am cbde9b92: am d107c305: Merge "Plumb through volume UUID when building paths."

* commit 'cbde9b92':
  Plumb through volume UUID when building paths.
parents b8d1ee37 cbde9b92
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ LOCAL_MODULE := libinstalld
LOCAL_MODULE_TAGS := eng tests
LOCAL_SRC_FILES := $(common_src_files)
LOCAL_CFLAGS := $(common_cflags)
LOCAL_SHARED_LIBRARIES := libbase
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
include $(BUILD_STATIC_LIBRARY)

@@ -24,7 +25,12 @@ LOCAL_MODULE := installd
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := $(common_cflags)
LOCAL_SRC_FILES := installd.cpp $(common_src_files)
LOCAL_SHARED_LIBRARIES := libcutils liblog libselinux
LOCAL_SHARED_LIBRARIES := \
    libbase \
    libcutils \
    liblog \
    libselinux \

LOCAL_STATIC_LIBRARIES := libdiskusage
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
include $(BUILD_EXECUTABLE)
+37 −138
Original line number Diff line number Diff line
@@ -33,11 +33,8 @@ dir_rec_t android_media_dir;
dir_rec_t android_mnt_expand_dir;
dir_rec_array_t android_system_dirs;

int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo)
int install(const char *uuid, const char *pkgname, uid_t uid, gid_t gid, const char *seinfo)
{
    char pkgdir[PKG_PATH_MAX];
    char libsymlink[PKG_PATH_MAX];
    char applibdir[PKG_PATH_MAX];
    struct stat libStat;

    if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) {
@@ -45,20 +42,8 @@ int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo)
        return -1;
    }

    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, 0)) {
        ALOGE("cannot create package path\n");
        return -1;
    }

    if (create_pkg_path(libsymlink, pkgname, PKG_LIB_POSTFIX, 0)) {
        ALOGE("cannot create package lib symlink origin path\n");
        return -1;
    }

    if (create_pkg_path_in_dir(applibdir, &android_app_lib_dir, pkgname, PKG_DIR_POSTFIX)) {
        ALOGE("cannot create package lib symlink dest path\n");
        return -1;
    }
    std::string _pkgdir(create_package_data_path(uuid, pkgname, 0));
    const char* pkgdir = _pkgdir.c_str();

    if (mkdir(pkgdir, 0751) < 0) {
        ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
@@ -70,42 +55,14 @@ int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo)
        return -1;
    }

    if (lstat(libsymlink, &libStat) < 0) {
        if (errno != ENOENT) {
            ALOGE("couldn't stat lib dir: %s\n", strerror(errno));
            return -1;
        }
    } else {
        if (S_ISDIR(libStat.st_mode)) {
            if (delete_dir_contents(libsymlink, 1, NULL) < 0) {
                ALOGE("couldn't delete lib directory during install for: %s", libsymlink);
                return -1;
            }
        } else if (S_ISLNK(libStat.st_mode)) {
            if (unlink(libsymlink) < 0) {
                ALOGE("couldn't unlink lib directory during install for: %s", libsymlink);
                return -1;
            }
        }
    }

    if (selinux_android_setfilecon(pkgdir, pkgname, seinfo, uid) < 0) {
        ALOGE("cannot setfilecon dir '%s': %s\n", pkgdir, strerror(errno));
        unlink(libsymlink);
        unlink(pkgdir);
        return -errno;
    }

    if (symlink(applibdir, libsymlink) < 0) {
        ALOGE("couldn't symlink directory '%s' -> '%s': %s\n", libsymlink, applibdir,
                strerror(errno));
        unlink(pkgdir);
        return -1;
    }

    if (chown(pkgdir, uid, gid) < 0) {
        ALOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
        unlink(libsymlink);
        unlink(pkgdir);
        return -1;
    }
@@ -113,12 +70,10 @@ int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo)
    return 0;
}

int uninstall(const char *pkgname, userid_t userid)
int uninstall(const char *uuid, const char *pkgname, userid_t userid)
{
    char pkgdir[PKG_PATH_MAX];

    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, userid))
        return -1;
    std::string _pkgdir(create_package_data_path(uuid, pkgname, userid));
    const char* pkgdir = _pkgdir.c_str();

    remove_profile_file(pkgname);

@@ -143,9 +98,8 @@ int renamepkg(const char *oldpkgname, const char *newpkgname)
    return 0;
}

int fix_uid(const char *pkgname, uid_t uid, gid_t gid)
int fix_uid(const char *uuid, const char *pkgname, uid_t uid, gid_t gid)
{
    char pkgdir[PKG_PATH_MAX];
    struct stat s;

    if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) {
@@ -153,10 +107,8 @@ int fix_uid(const char *pkgname, uid_t uid, gid_t gid)
        return -1;
    }

    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, 0)) {
        ALOGE("cannot create package path\n");
        return -1;
    }
    std::string _pkgdir(create_package_data_path(uuid, pkgname, 0));
    const char* pkgdir = _pkgdir.c_str();

    if (stat(pkgdir, &s) < 0) return -1;

@@ -179,35 +131,20 @@ int fix_uid(const char *pkgname, uid_t uid, gid_t gid)
    return 0;
}

int delete_user_data(const char *pkgname, userid_t userid)
int delete_user_data(const char *uuid, const char *pkgname, userid_t userid)
{
    char pkgdir[PKG_PATH_MAX];

    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, userid))
        return -1;
    std::string _pkgdir(create_package_data_path(uuid, pkgname, userid));
    const char* pkgdir = _pkgdir.c_str();

    return delete_dir_contents(pkgdir, 0, NULL);
}

int make_user_data(const char *pkgname, uid_t uid, userid_t userid, const char* seinfo)
int make_user_data(const char *uuid, const char *pkgname, uid_t uid, userid_t userid, const char* seinfo)
{
    char pkgdir[PKG_PATH_MAX];
    char applibdir[PKG_PATH_MAX];
    char libsymlink[PKG_PATH_MAX];
    struct stat libStat;

    // Create the data dir for the package
    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, userid)) {
        return -1;
    }
    if (create_pkg_path(libsymlink, pkgname, PKG_LIB_POSTFIX, userid)) {
        ALOGE("cannot create package lib symlink origin path\n");
        return -1;
    }
    if (create_pkg_path_in_dir(applibdir, &android_app_lib_dir, pkgname, PKG_DIR_POSTFIX)) {
        ALOGE("cannot create package lib symlink dest path\n");
        return -1;
    }
    std::string _pkgdir(create_package_data_path(uuid, pkgname, userid));
    const char* pkgdir = _pkgdir.c_str();

    if (mkdir(pkgdir, 0751) < 0) {
        ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
@@ -219,47 +156,14 @@ int make_user_data(const char *pkgname, uid_t uid, userid_t userid, const char*
        return -errno;
    }

    if (lstat(libsymlink, &libStat) < 0) {
        if (errno != ENOENT) {
            ALOGE("couldn't stat lib dir for non-primary: %s\n", strerror(errno));
            unlink(pkgdir);
            return -1;
        }
    } else {
        if (S_ISDIR(libStat.st_mode)) {
            if (delete_dir_contents(libsymlink, 1, NULL) < 0) {
                ALOGE("couldn't delete lib directory during install for non-primary: %s",
                        libsymlink);
                unlink(pkgdir);
                return -1;
            }
        } else if (S_ISLNK(libStat.st_mode)) {
            if (unlink(libsymlink) < 0) {
                ALOGE("couldn't unlink lib directory during install for non-primary: %s",
                        libsymlink);
                unlink(pkgdir);
                return -1;
            }
        }
    }

    if (selinux_android_setfilecon(pkgdir, pkgname, seinfo, uid) < 0) {
        ALOGE("cannot setfilecon dir '%s': %s\n", pkgdir, strerror(errno));
        unlink(libsymlink);
        unlink(pkgdir);
        return -errno;
    }

    if (symlink(applibdir, libsymlink) < 0) {
        ALOGE("couldn't symlink directory for non-primary '%s' -> '%s': %s\n", libsymlink,
                applibdir, strerror(errno));
        unlink(pkgdir);
        return -1;
    }

    if (chown(pkgdir, uid, uid) < 0) {
        ALOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno));
        unlink(libsymlink);
        unlink(pkgdir);
        return -errno;
    }
@@ -301,24 +205,23 @@ int delete_user(userid_t userid)
    return status;
}

int delete_cache(const char *pkgname, userid_t userid)
int delete_cache(const char *uuid, const char *pkgname, userid_t userid)
{
    char cachedir[PKG_PATH_MAX];

    if (create_pkg_path(cachedir, pkgname, CACHE_DIR_POSTFIX, userid))
        return -1;
    std::string _cachedir(
            create_package_data_path(uuid, pkgname, userid) + CACHE_DIR_POSTFIX);
    const char* cachedir = _cachedir.c_str();

    /* delete contents, not the directory, no exceptions */
    return delete_dir_contents(cachedir, 0, NULL);
}

int delete_code_cache(const char *pkgname, userid_t userid)
int delete_code_cache(const char *uuid, const char *pkgname, userid_t userid)
{
    char codecachedir[PKG_PATH_MAX];
    struct stat s;
    std::string _codecachedir(
            create_package_data_path(uuid, pkgname, userid) + CACHE_DIR_POSTFIX);
    const char* codecachedir = _codecachedir.c_str();

    if (create_pkg_path(codecachedir, pkgname, CODE_CACHE_DIR_POSTFIX, userid))
        return -1;
    struct stat s;

    /* it's okay if code cache is missing */
    if (lstat(codecachedir, &s) == -1 && errno == ENOENT) {
@@ -336,6 +239,7 @@ int delete_code_cache(const char *pkgname, userid_t userid)
 * also require that apps constantly modify file metadata even
 * when just reading from the cache, which is pretty awful.
 */
// TODO: extend to know about other volumes
int free_cache(int64_t free_size)
{
    cache_t* cache;
@@ -467,7 +371,7 @@ int rm_dex(const char *path, const char *instruction_set)
    }
}

int get_size(const char *pkgname, userid_t userid, const char *apkpath,
int get_size(const char *uuid, const char *pkgname, userid_t userid, const char *apkpath,
             const char *libdirpath, const char *fwdlock_apkpath, const char *asecpath,
             const char *instruction_set, int64_t *_codesize, int64_t *_datasize,
             int64_t *_cachesize, int64_t* _asecsize)
@@ -524,11 +428,10 @@ int get_size(const char *pkgname, userid_t userid, const char *apkpath,
        }
    }

    if (create_pkg_path(path, pkgname, PKG_DIR_POSTFIX, userid)) {
        goto done;
    }
    std::string _pkgdir(create_package_data_path(uuid, pkgname, userid));
    const char* pkgdir = _pkgdir.c_str();

    d = opendir(path);
    d = opendir(pkgdir);
    if (d == NULL) {
        goto done;
    }
@@ -1457,21 +1360,16 @@ done:
    return 0;
}

int linklib(const char* pkgname, const char* asecLibDir, int userId)
int linklib(const char* uuid, const char* pkgname, const char* asecLibDir, int userId)
{
    char pkgdir[PKG_PATH_MAX];
    char libsymlink[PKG_PATH_MAX];
    struct stat s, libStat;
    int rc = 0;

    if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, userId)) {
        ALOGE("cannot create package path\n");
        return -1;
    }
    if (create_pkg_path(libsymlink, pkgname, PKG_LIB_POSTFIX, userId)) {
        ALOGE("cannot create package lib symlink origin path\n");
        return -1;
    }
    std::string _pkgdir(create_package_data_path(uuid, pkgname, userId));
    std::string _libsymlink(_pkgdir + PKG_LIB_POSTFIX);

    const char* pkgdir = _pkgdir.c_str();
    const char* libsymlink = _libsymlink.c_str();

    if (stat(pkgdir, &s) < 0) return -1;

@@ -1640,7 +1538,8 @@ fail:
    return -1;
}

int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid)
// TODO: extend to know about other volumes
int restorecon_data(const char *uuid, const char* pkgName, const char* seinfo, uid_t uid)
{
    struct dirent *entry;
    DIR *d;
+10 −10
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ static int do_ping(char **arg __unused, char reply[REPLY_MAX] __unused)

static int do_install(char **arg, char reply[REPLY_MAX] __unused)
{
    return install(arg[0], atoi(arg[1]), atoi(arg[2]), arg[3]); /* pkgname, uid, gid, seinfo */
    return install(nullptr, arg[0], atoi(arg[1]), atoi(arg[2]), arg[3]); /* pkgname, uid, gid, seinfo */
}

static int do_dexopt(char **arg, char reply[REPLY_MAX] __unused)
@@ -61,7 +61,7 @@ static int do_rm_dex(char **arg, char reply[REPLY_MAX] __unused)

static int do_remove(char **arg, char reply[REPLY_MAX] __unused)
{
    return uninstall(arg[0], atoi(arg[1])); /* pkgname, userid */
    return uninstall(nullptr, arg[0], atoi(arg[1])); /* pkgname, userid */
}

static int do_rename(char **arg, char reply[REPLY_MAX] __unused)
@@ -71,7 +71,7 @@ static int do_rename(char **arg, char reply[REPLY_MAX] __unused)

static int do_fixuid(char **arg, char reply[REPLY_MAX] __unused)
{
    return fix_uid(arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, gid */
    return fix_uid(nullptr, arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, gid */
}

static int do_free_cache(char **arg, char reply[REPLY_MAX] __unused) /* TODO int:free_size */
@@ -81,12 +81,12 @@ static int do_free_cache(char **arg, char reply[REPLY_MAX] __unused) /* TODO int

static int do_rm_cache(char **arg, char reply[REPLY_MAX] __unused)
{
    return delete_cache(arg[0], atoi(arg[1])); /* pkgname, userid */
    return delete_cache(nullptr, arg[0], atoi(arg[1])); /* pkgname, userid */
}

static int do_rm_code_cache(char **arg, char reply[REPLY_MAX] __unused)
{
    return delete_code_cache(arg[0], atoi(arg[1])); /* pkgname, userid */
    return delete_code_cache(nullptr, arg[0], atoi(arg[1])); /* pkgname, userid */
}

static int do_get_size(char **arg, char reply[REPLY_MAX])
@@ -98,7 +98,7 @@ static int do_get_size(char **arg, char reply[REPLY_MAX])
    int res = 0;

        /* pkgdir, userid, apkpath */
    res = get_size(arg[0], atoi(arg[1]), arg[2], arg[3], arg[4], arg[5],
    res = get_size(nullptr, arg[0], atoi(arg[1]), arg[2], arg[3], arg[4], arg[5],
            arg[6], &codesize, &datasize, &cachesize, &asecsize);

    /*
@@ -112,12 +112,12 @@ static int do_get_size(char **arg, char reply[REPLY_MAX])

static int do_rm_user_data(char **arg, char reply[REPLY_MAX] __unused)
{
    return delete_user_data(arg[0], atoi(arg[1])); /* pkgname, userid */
    return delete_user_data(nullptr, arg[0], atoi(arg[1])); /* pkgname, userid */
}

static int do_mk_user_data(char **arg, char reply[REPLY_MAX] __unused)
{
    return make_user_data(arg[0], atoi(arg[1]), atoi(arg[2]), arg[3]);
    return make_user_data(nullptr, arg[0], atoi(arg[1]), atoi(arg[2]), arg[3]);
                             /* pkgname, uid, userid, seinfo */
}

@@ -138,7 +138,7 @@ static int do_movefiles(char **arg __unused, char reply[REPLY_MAX] __unused)

static int do_linklib(char **arg, char reply[REPLY_MAX] __unused)
{
    return linklib(arg[0], arg[1], atoi(arg[2]));
    return linklib(nullptr, arg[0], arg[1], atoi(arg[2]));
}

static int do_idmap(char **arg, char reply[REPLY_MAX] __unused)
@@ -148,7 +148,7 @@ static int do_idmap(char **arg, char reply[REPLY_MAX] __unused)

static int do_restorecon_data(char **arg, char reply[REPLY_MAX] __attribute__((unused)))
{
    return restorecon_data(arg[0], arg[1], atoi(arg[2]));
    return restorecon_data(nullptr, arg[0], arg[1], atoi(arg[2]));
                             /* pkgName, seinfo, uid*/
}

+13 −14
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string>

#include <cutils/fs.h>
#include <cutils/sockets.h>
@@ -138,10 +139,8 @@ typedef struct {

/* util.c */

int create_pkg_path_in_dir(char path[PKG_PATH_MAX],
                                const dir_rec_t* dir,
                                const char* pkgname,
                                const char* postfix);
std::string create_package_data_path(const char* volume_uuid,
        const char* package_name, userid_t user);

int create_pkg_path(char path[PKG_PATH_MAX],
                    const char *pkgname,
@@ -208,20 +207,20 @@ void remove_profile_file(const char *pkgname);

/* commands.c */

int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo);
int uninstall(const char *pkgname, userid_t userid);
int install(const char *uuid, const char *pkgname, uid_t uid, gid_t gid, const char *seinfo);
int uninstall(const char *uuid, const char *pkgname, userid_t userid);
int renamepkg(const char *oldpkgname, const char *newpkgname);
int fix_uid(const char *pkgname, uid_t uid, gid_t gid);
int delete_user_data(const char *pkgname, userid_t userid);
int make_user_data(const char *pkgname, uid_t uid, userid_t userid, const char* seinfo);
int fix_uid(const char *uuid, const char *pkgname, uid_t uid, gid_t gid);
int delete_user_data(const char *uuid, const char *pkgname, userid_t userid);
int make_user_data(const char *uuid, const char *pkgname, uid_t uid, userid_t userid, const char* seinfo);
int make_user_config(userid_t userid);
int delete_user(userid_t userid);
int delete_cache(const char *pkgname, userid_t userid);
int delete_code_cache(const char *pkgname, userid_t userid);
int delete_cache(const char *uuid, const char *pkgname, userid_t userid);
int delete_code_cache(const char *uuid, const char *pkgname, userid_t userid);
int move_dex(const char *src, const char *dst, const char *instruction_set);
int rm_dex(const char *path, const char *instruction_set);
int protect(char *pkgname, gid_t gid);
int get_size(const char *pkgname, userid_t userid, const char *apkpath, const char *libdirpath,
int get_size(const char *uuid, const char *pkgname, userid_t userid, const char *apkpath, const char *libdirpath,
             const char *fwdlock_apkpath, const char *asecpath, const char *instruction_set,
             int64_t *codesize, int64_t *datasize, int64_t *cachesize, int64_t *asecsize);
int free_cache(int64_t free_size);
@@ -230,9 +229,9 @@ int dexopt(const char *apk_path, uid_t uid, bool is_public, const char *pkgName,
           bool debuggable, const char* oat_dir);
int mark_boot_complete(const char *instruction_set);
int movefiles();
int linklib(const char* target, const char* source, int userId);
int linklib(const char *uuid, const char* target, const char* source, int userId);
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid);
int restorecon_data(const char *uuid, const char* pkgName, const char* seinfo, uid_t uid);
int create_oat_dir(const char* oat_dir, const char *instruction_set);
int rm_package_dir(const char* apk_path);
int calculate_oat_file_path(char path[PKG_PATH_MAX], const char *oat_dir, const char *apk_path,
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ test_src_files := \
    installd_utils_test.cpp

shared_libraries := \
    libbase \
    libutils \
    libcutils \

Loading