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;
+}
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, };
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 --");
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)) {