Source
79
79
}
80
80
81
81
static int gid_cmp(const void *_a, const void *_b)
82
82
{
83
83
kgid_t a = *(kgid_t *)_a;
84
84
kgid_t b = *(kgid_t *)_b;
85
85
86
86
return gid_gt(a, b) - gid_lt(a, b);
87
87
}
88
88
89
-
static void groups_sort(struct group_info *group_info)
89
+
void groups_sort(struct group_info *group_info)
90
90
{
91
91
sort(group_info->gid, group_info->ngroups, sizeof(*group_info->gid),
92
92
gid_cmp, NULL);
93
93
}
94
+
EXPORT_SYMBOL(groups_sort);
94
95
95
96
/* a simple bsearch */
96
97
int groups_search(const struct group_info *group_info, kgid_t grp)
97
98
{
98
99
unsigned int left, right;
99
100
100
101
if (!group_info)
101
102
return 0;
102
103
103
104
left = 0;
115
116
}
116
117
117
118
/**
118
119
* set_groups - Change a group subscription in a set of credentials
119
120
* @new: The newly prepared set of credentials to alter
120
121
* @group_info: The group list to install
121
122
*/
122
123
void set_groups(struct cred *new, struct group_info *group_info)
123
124
{
124
125
put_group_info(new->group_info);
125
-
groups_sort(group_info);
126
126
get_group_info(group_info);
127
127
new->group_info = group_info;
128
128
}
129
129
130
130
EXPORT_SYMBOL(set_groups);
131
131
132
132
/**
133
133
* set_current_groups - Change current's group subscription
134
134
* @group_info: The group list to impose
135
135
*
199
199
200
200
group_info = groups_alloc(gidsetsize);
201
201
if (!group_info)
202
202
return -ENOMEM;
203
203
retval = groups_from_user(group_info, grouplist);
204
204
if (retval) {
205
205
put_group_info(group_info);
206
206
return retval;
207
207
}
208
208
209
+
groups_sort(group_info);
209
210
retval = set_current_groups(group_info);
210
211
put_group_info(group_info);
211
212
212
213
return retval;
213
214
}
214
215
215
216
/*
216
217
* Check whether we're fsgid/egid or in the supplemental group..
217
218
*/
218
219
int in_group_p(kgid_t grp)