Implement res control feature 71/251371/7
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 13 Jan 2021 07:30:40 +0000 (16:30 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Mon, 15 Feb 2021 04:17:41 +0000 (04:17 +0000)
Change-Id: Ieaa09ca6b547430a3bad33a007e90ae600c9480a
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/launchpad-process-pool/src/launchpad.c
src/lib/common/inc/key.h
src/lib/common/inc/launchpad_common.h
src/lib/common/src/launchpad_common.c
src/lib/launchpad/src/launchpad_lib.c

index c2db5ecb702bfdd1b281b5bdd0096ec0cc57a71f..72f114f66e83bd1bad8a5d4cfb4e9c99d00a6cbe 100644 (file)
@@ -1258,6 +1258,10 @@ static int __prepare_exec(const char *appid, const char *app_path,
                return PAD_ERR_REJECTED;
        }
 
+       ret = _mount_res_dir(menu_info->root_path, kb);
+       if (ret < 0)
+               return PAD_ERR_FAILED;
+
        /* SET PRIVILEGES*/
        _W("security_manager_prepare_app ++");
        ret = security_manager_prepare_app(appid);
index d3d2973f7feabacb8080a3b4c9a5d6d54fcc9f2f..19493c6d77cbf1c2e74f2eadd35f7b5521988ee4 100644 (file)
@@ -49,10 +49,11 @@ extern "C" {
 #define AUL_K_TEP_PATH                 "__AUL_TEP_PATH__"
 #define AUL_K_IS_INSTALLED             "__AUL_IS_INSTALLED__"
 #define AUL_K_INSTALLED_STORAGE                "__AUL_INSTALLED_STORAGE__"
+#define AUL_K_MOUNT_GLOBAL_RES_DIR     "__AUL_MOUNT_GLOBAL_RES_DIR__"
+#define AUL_K_MOUNT_ALLOWED_RES_DIR    "__AUL_MOUNT_ALLOWED_RES_DIR__"
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif  /* __KEY_H__ */
-
index 2b1d41cdb66c6eda3cb52acc81be801b269b86f5..ff257a1f757f8122b248f8264c7392ffdc28186b 100644 (file)
@@ -133,6 +133,7 @@ int _enable_external_pkg(bundle *b, const char *pkgid, uid_t pkg_uid);
 int _verify_proc_caps(void);
 int _prepare_id_file(void);
 void _print_hwc_log(const char *format, ...);
+int _mount_res_dir(const char *menu_info, bundle *kb);
 
 #ifdef __cplusplus
 }
index d4e0622bbd663191c80d6461f759f156751b94bf..7c4ab6f15aa3da7afc721c155d2ea9499ce7b474 100644 (file)
@@ -1492,3 +1492,86 @@ void _print_hwc_log(const char *format, ...)
 
        prctl(PR_TASK_PERF_USER_TRACE, buf, strlen(buf));
 }
+
+static int __get_mount_opt(const char *srcs[], size_t srcs_len,
+       const char *dest, const char *workdir, char *opt, size_t opt_len)
+{
+       int i;
+       char buf[PATH_MAX];
+       int ret;
+
+       snprintf(buf, sizeof(buf), "%s", "lowerdir=");
+       snprintf(opt, opt_len, "%s", buf);
+       for (i = 0; i < srcs_len; i++) {
+               snprintf(buf, sizeof(buf), "%s%s", opt, srcs[i]);
+               ret = snprintf(opt, opt_len, "%s:", buf);
+               if (ret < 0) {
+                       _E("source directory string size is too large");
+                       return -1;
+               }
+       }
+       ret = snprintf(opt, opt_len, "%s,upperdir=%s,workdir=%s", buf, dest,
+                       workdir);
+       if (ret < 0) {
+               _E("source directory string size is too large");
+               return -1;
+       }
+
+       _D("mount opt: %s", opt);
+
+       return 0;
+}
+
+static int __mount_dir(const char *srcs[], size_t srcs_len, const char *dest,
+               const char *workdir)
+{
+       int ret;
+       char opt[PATH_MAX];
+
+       ret = __get_mount_opt(srcs, srcs_len, dest, workdir, opt, sizeof(opt));
+       if (ret < 0) {
+               _E("Failed to get mount option");
+               return -1;
+       }
+
+       ret = mount(NULL, dest, "overlay", MS_RDONLY, opt);
+       if (ret < 0) {
+               _E("Failed to mount dir %s. errno(%d)", dest, errno);
+               return -1;
+       }
+
+       return 0;
+}
+
+int _mount_res_dir(const char *root_path, bundle *kb)
+{
+       const char **val;
+       int len;
+       char dest[PATH_MAX];
+       char workdir[PATH_MAX];
+
+       val = bundle_get_str_array(kb, AUL_K_MOUNT_GLOBAL_RES_DIR, &len);
+       if (val) {
+               snprintf(dest, sizeof(dest), "%s/res/mount/global", root_path);
+               snprintf(workdir, sizeof(workdir), "%s/res/mount/work",
+                               root_path);
+               __mount_dir(val, len, dest, workdir);
+       } else if (get_last_result() != BUNDLE_ERROR_KEY_NOT_AVAILABLE) {
+               _E("invalid mount info");
+               return -1;
+       }
+
+       val = bundle_get_str_array(kb, AUL_K_MOUNT_ALLOWED_RES_DIR, &len);
+       if (val) {
+               snprintf(dest, sizeof(dest), "%s/res/mount/allowed", root_path);
+               snprintf(workdir, sizeof(workdir), "%s/res/mount/work",
+                               root_path);
+               __mount_dir(val, len, dest, workdir);
+       } else if (get_last_result() != BUNDLE_ERROR_KEY_NOT_AVAILABLE) {
+               _E("invalid mount info");
+               return -1;
+       }
+
+
+       return 0;
+}
index 68c2ac496710ddf01ec16b227fd8f8327fbd9764..05fa2c3ab6bf30c34887218c5bbacf3b289c08fe 100644 (file)
@@ -62,7 +62,7 @@ static void __at_exit_to_release_bundle(void)
 
 static int __prepare_exec(const char *appid, const char *app_path,
                        const char *pkg_type, int type, const char* pkgid,
-                       bool global, bundle *kb)
+                       const char *root_path, bool global, bundle *kb)
 {
        const char *file_name = NULL;
        char process_name[AUL_PR_NAME] = { 0, };
@@ -90,6 +90,10 @@ static int __prepare_exec(const char *appid, const char *app_path,
                return -1;
        }
 
+       ret = _mount_res_dir(root_path, kb);
+       if (ret < 0)
+               return -1;
+
        _W("security_manager_prepare_app ++");
        ret = security_manager_prepare_app(appid);
        _W("security_manager_prepare_app --");
@@ -166,7 +170,7 @@ static int __default_launch_cb(bundle *kb, const char *appid,
        int r;
 
        r = __prepare_exec(appid, app_path, pkg_type, loader_type, pkgid,
-                       global, kb);
+                       root_path, global, kb);
        if (r < 0) {
                _E("__candidate_process_prepare_exec() failed");
                if (access(app_path, F_OK | R_OK)) {