|
@@ -86,11 +86,12 @@ static int gid_cmp(const void *_a, const void *_b)
|
|
|
return gid_gt(a, b) - gid_lt(a, b);
|
|
|
}
|
|
|
|
|
|
-static void groups_sort(struct group_info *group_info)
|
|
|
+void groups_sort(struct group_info *group_info)
|
|
|
{
|
|
|
sort(group_info->gid, group_info->ngroups, sizeof(*group_info->gid),
|
|
|
gid_cmp, NULL);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(groups_sort);
|
|
|
|
|
|
/* a simple bsearch */
|
|
|
int groups_search(const struct group_info *group_info, kgid_t grp)
|
|
@@ -122,7 +123,6 @@ int groups_search(const struct group_info *group_info, kgid_t grp)
|
|
|
void set_groups(struct cred *new, struct group_info *group_info)
|
|
|
{
|
|
|
put_group_info(new->group_info);
|
|
|
- groups_sort(group_info);
|
|
|
get_group_info(group_info);
|
|
|
new->group_info = group_info;
|
|
|
}
|
|
@@ -206,6 +206,7 @@ SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist)
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+ groups_sort(group_info);
|
|
|
retval = set_current_groups(group_info);
|
|
|
put_group_info(group_info);
|
|
|
|