Loading cmds/installd/Android.mk +7 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) cmds/installd/commands.cpp +37 −138 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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)); Loading @@ -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; } Loading @@ -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); Loading @@ -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)) { Loading @@ -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; Loading @@ -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)); Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; Loading cmds/installd/installd.cpp +10 −10 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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) Loading @@ -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 */ Loading @@ -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]) Loading @@ -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); /* Loading @@ -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 */ } Loading @@ -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) Loading @@ -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*/ } Loading cmds/installd/installd.h +13 −14 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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, Loading Loading @@ -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); Loading @@ -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, Loading cmds/installd/tests/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ test_src_files := \ installd_utils_test.cpp shared_libraries := \ libbase \ libutils \ libcutils \ Loading Loading
cmds/installd/Android.mk +7 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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)
cmds/installd/commands.cpp +37 −138 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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)); Loading @@ -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; } Loading @@ -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); Loading @@ -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)) { Loading @@ -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; Loading @@ -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)); Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; Loading
cmds/installd/installd.cpp +10 −10 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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) Loading @@ -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 */ Loading @@ -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]) Loading @@ -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); /* Loading @@ -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 */ } Loading @@ -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) Loading @@ -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*/ } Loading
cmds/installd/installd.h +13 −14 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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, Loading Loading @@ -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); Loading @@ -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, Loading
cmds/installd/tests/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ test_src_files := \ installd_utils_test.cpp shared_libraries := \ libbase \ libutils \ libcutils \ Loading