svn commit: r273684 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Sun Oct 26 05:39:42 UTC 2014
Author: mjg
Date: Sun Oct 26 05:39:42 2014
New Revision: 273684
URL: https://svnweb.freebsd.org/changeset/base/273684
Log:
Use a temporary buffer in sys_setgroups for requests with <= XU_NGROUPS groups.
Submitted by: Tiwei Bie <btw mail.ustc.edu.cn>
X-Additional: JuniorJobs project
MFC after: 2 weeks
Modified:
head/sys/kern/kern_prot.c
Modified: head/sys/kern/kern_prot.c
==============================================================================
--- head/sys/kern/kern_prot.c Sun Oct 26 04:44:28 2014 (r273683)
+++ head/sys/kern/kern_prot.c Sun Oct 26 05:39:42 2014 (r273684)
@@ -806,17 +806,24 @@ int
sys_setgroups(struct thread *td, struct setgroups_args *uap)
{
gid_t *groups = NULL;
+ gid_t smallgroups[XU_NGROUPS];
+ u_int gidsetsize;
int error;
- if (uap->gidsetsize > ngroups_max + 1)
+ gidsetsize = uap->gidsetsize;
+ if (gidsetsize > ngroups_max + 1)
return (EINVAL);
- groups = malloc(uap->gidsetsize * sizeof(gid_t), M_TEMP, M_WAITOK);
- error = copyin(uap->gidset, groups, uap->gidsetsize * sizeof(gid_t));
+ if (gidsetsize > XU_NGROUPS)
+ groups = malloc(gidsetsize * sizeof(gid_t), M_TEMP, M_WAITOK);
+ else
+ groups = smallgroups;
+ error = copyin(uap->gidset, groups, gidsetsize * sizeof(gid_t));
if (error)
goto out;
- error = kern_setgroups(td, uap->gidsetsize, groups);
+ error = kern_setgroups(td, gidsetsize, groups);
out:
- free(groups, M_TEMP);
+ if (gidsetsize > XU_NGROUPS)
+ free(groups, M_TEMP);
return (error);
}
More information about the svn-src-head
mailing list