/* export the group_info to a user-space array */ staticint groups_to_user(gid_t __user *grouplist, conststruct group_info *group_info)
{ struct user_namespace *user_ns = current_user_ns(); int i; unsignedint count = group_info->ngroups;
for (i = 0; i < count; i++) {
gid_t gid;
gid = from_kgid_munged(user_ns, group_info->gid[i]); if (put_user(gid, grouplist+i)) return -EFAULT;
} return0;
}
/* fill a group_info from a user-space array - it must be allocated already */ staticint groups_from_user(struct group_info *group_info,
gid_t __user *grouplist)
{ struct user_namespace *user_ns = current_user_ns(); int i; unsignedint count = group_info->ngroups;
for (i = 0; i < count; i++) {
gid_t gid;
kgid_t kgid; if (get_user(gid, grouplist+i)) return -EFAULT;
kgid = make_kgid(user_ns, gid); if (!gid_valid(kgid)) return -EINVAL;
group_info->gid[i] = kgid;
} return0;
}
staticint gid_cmp(constvoid *_a, constvoid *_b)
{
kgid_t a = *(kgid_t *)_a;
kgid_t b = *(kgid_t *)_b;
/* no need to grab task_lock here; it cannot change */
i = cred->group_info->ngroups; if (gidsetsize) { if (i > gidsetsize) {
i = -EINVAL; goto out;
} if (groups_to_user(grouplist, cred->group_info)) {
i = -EFAULT; goto out;
}
}
out: return i;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.