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

Commit 4b3d6e31 authored by Nick Kralevich's avatar Nick Kralevich Committed by Android Git Automerger
Browse files

am 3ebb877e: Merge "Modify installd\'s restorecon function."

* commit '3ebb877e':
  Modify installd's restorecon function.
parents 6c4e2d81 3ebb877e
Loading
Loading
Loading
Loading
+65 −14
Original line number Original line Diff line number Diff line
@@ -1235,31 +1235,82 @@ fail:
    return -1;
    return -1;
}
}


int restorecon_data()
int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid)
{
{
    char *data_dir = build_string2(android_data_dir.path, PRIMARY_USER_PREFIX);
    struct dirent *entry;
    char *user_dir = build_string2(android_data_dir.path, SECONDARY_USER_PREFIX);
    DIR *d;
    struct stat s;
    char *userdir;
    char *primarydir;
    char *pkgdir;
    int ret = 0;


    unsigned int flags = SELINUX_ANDROID_RESTORECON_RECURSE |
    // SELINUX_ANDROID_RESTORECON_DATADATA flag is set by libselinux. Not needed here.
            SELINUX_ANDROID_RESTORECON_DATADATA;
    unsigned int flags = SELINUX_ANDROID_RESTORECON_RECURSE;


    int ret = 0;
    if (!pkgName || !seinfo) {
        ALOGE("Package name or seinfo tag is null when trying to restorecon.");
        return -1;
    }


    if (!data_dir || !user_dir) {
    if (asprintf(&primarydir, "%s%s%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgName) < 0) {
        return -1;
        return -1;
    }
    }


    if (selinux_android_restorecon(data_dir, flags) < 0) {
    // Relabel for primary user.
        ALOGE("restorecon failed for %s: %s\n", data_dir, strerror(errno));
    if (selinux_android_restorecon_pkgdir(primarydir, seinfo, uid, flags) < 0) {
        ALOGE("restorecon failed for %s: %s\n", primarydir, strerror(errno));
        ret |= -1;
        ret |= -1;
    }
    }


    if (selinux_android_restorecon(user_dir, flags) < 0) {
    if (asprintf(&userdir, "%s%s", android_data_dir.path, SECONDARY_USER_PREFIX) < 0) {
        ALOGE("restorecon failed for %s: %s\n", user_dir, strerror(errno));
        free(primarydir);
        return -1;
    }

    // Relabel package directory for all secondary users.
    d = opendir(userdir);
    if (d == NULL) {
        free(primarydir);
        free(userdir);
        return -1;
    }

    while ((entry = readdir(d))) {
        if (entry->d_type != DT_DIR) {
            continue;
        }

        const char *user = entry->d_name;
        // Ignore "." and ".."
        if (!strcmp(user, ".") || !strcmp(user, "..")) {
            continue;
        }

        // user directories start with a number
        if (user[0] < '0' || user[0] > '9') {
            ALOGE("Expecting numbered directory during restorecon. Instead got '%s'.", user);
            continue;
        }

        if (asprintf(&pkgdir, "%s%s/%s", userdir, user, pkgName) < 0) {
            continue;
        }

        if (stat(pkgdir, &s) < 0) {
            free(pkgdir);
            continue;
        }

        if (selinux_android_restorecon_pkgdir(pkgdir, seinfo, uid, flags) < 0) {
            ALOGE("restorecon failed for %s: %s\n", pkgdir, strerror(errno));
            ret |= -1;
            ret |= -1;
        }
        }
        free(pkgdir);
    }


    free(data_dir);
    closedir(d);
    free(user_dir);
    free(primarydir);
    free(userdir);
    return ret;
    return ret;
}
}
+4 −4
Original line number Original line Diff line number Diff line
@@ -129,10 +129,10 @@ static int do_idmap(char **arg, char reply[REPLY_MAX])
    return idmap(arg[0], arg[1], atoi(arg[2]));
    return idmap(arg[0], arg[1], atoi(arg[2]));
}
}


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


struct cmdinfo {
struct cmdinfo {
@@ -159,7 +159,7 @@ struct cmdinfo cmds[] = {
    { "mkuserdata",           4, do_mk_user_data },
    { "mkuserdata",           4, do_mk_user_data },
    { "rmuser",               1, do_rm_user },
    { "rmuser",               1, do_rm_user },
    { "idmap",                3, do_idmap },
    { "idmap",                3, do_idmap },
    { "restorecondata",       0, do_restorecon_data },
    { "restorecondata",       3, do_restorecon_data },
};
};


static int readx(int s, void *_buf, int count)
static int readx(int s, void *_buf, int count)