svn commit: r273436 - in head/sys: i386/ibcs2 kern sys

Mateusz Guzik mjg at FreeBSD.org
Tue Oct 21 23:08:48 UTC 2014


Author: mjg
Date: Tue Oct 21 23:08:46 2014
New Revision: 273436
URL: https://svnweb.freebsd.org/changeset/base/273436

Log:
  Eliminate unnecessary memory allocation in sys_getgroups and its ibcs2 counterpart.

Modified:
  head/sys/i386/ibcs2/ibcs2_misc.c
  head/sys/kern/kern_prot.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/i386/ibcs2/ibcs2_misc.c
==============================================================================
--- head/sys/i386/ibcs2/ibcs2_misc.c	Tue Oct 21 23:07:30 2014	(r273435)
+++ head/sys/i386/ibcs2/ibcs2_misc.c	Tue Oct 21 23:08:46 2014	(r273436)
@@ -659,33 +659,28 @@ ibcs2_getgroups(td, uap)
 	struct thread *td;
 	struct ibcs2_getgroups_args *uap;
 {
+	struct ucred *cred;
 	ibcs2_gid_t *iset;
-	gid_t *gp;
 	u_int i, ngrp;
 	int error;
 
-	if (uap->gidsetsize < td->td_ucred->cr_ngroups) {
-		if (uap->gidsetsize == 0)
-			ngrp = 0;
-		else
-			return (EINVAL);
-	} else
-		ngrp = td->td_ucred->cr_ngroups;
-	gp = malloc(ngrp * sizeof(*gp), M_TEMP, M_WAITOK);
-	error = kern_getgroups(td, &ngrp, gp);
-	if (error)
+	cred = td->td_ucred;
+	ngrp = cred->cr_ngroups;
+
+	if (uap->gidsetsize == 0) {
+		error = 0;
 		goto out;
-	if (uap->gidsetsize > 0) {
-		iset = malloc(ngrp * sizeof(*iset), M_TEMP, M_WAITOK);
-		for (i = 0; i < ngrp; i++)
-			iset[i] = (ibcs2_gid_t)gp[i];
-		error = copyout(iset, uap->gidset, ngrp * sizeof(ibcs2_gid_t));
-		free(iset, M_TEMP);
 	}
-	if (error == 0)
-		td->td_retval[0] = ngrp;
+	if (uap->gidsetsize < ngrp)
+		return (EINVAL);
+
+	iset = malloc(ngrp * sizeof(*iset), M_TEMP, M_WAITOK);
+	for (i = 0; i < ngrp; i++)
+		iset[i] = (ibcs2_gid_t)cred->cr_groups[i];
+	error = copyout(iset, uap->gidset, ngrp * sizeof(ibcs2_gid_t));
+	free(iset, M_TEMP);
 out:
-	free(gp, M_TEMP);
+	td->td_retval[0] = ngrp;
 	return (error);
 }
 

Modified: head/sys/kern/kern_prot.c
==============================================================================
--- head/sys/kern/kern_prot.c	Tue Oct 21 23:07:30 2014	(r273435)
+++ head/sys/kern/kern_prot.c	Tue Oct 21 23:08:46 2014	(r273436)
@@ -303,45 +303,24 @@ struct getgroups_args {
 int
 sys_getgroups(struct thread *td, register struct getgroups_args *uap)
 {
-	gid_t *groups;
+	struct ucred *cred;
 	u_int ngrp;
 	int error;
 
-	if (uap->gidsetsize < td->td_ucred->cr_ngroups) {
-		if (uap->gidsetsize == 0)
-			ngrp = 0;
-		else
-			return (EINVAL);
-	} else
-		ngrp = td->td_ucred->cr_ngroups;
-	groups = malloc(ngrp * sizeof(*groups), M_TEMP, M_WAITOK);
-	error = kern_getgroups(td, &ngrp, groups);
-	if (error)
-		goto out;
-	if (uap->gidsetsize > 0)
-		error = copyout(groups, uap->gidset, ngrp * sizeof(gid_t));
-	if (error == 0)
-		td->td_retval[0] = ngrp;
-out:
-	free(groups, M_TEMP);
-	return (error);
-}
-
-int
-kern_getgroups(struct thread *td, u_int *ngrp, gid_t *groups)
-{
-	struct ucred *cred;
-
 	cred = td->td_ucred;
-	if (*ngrp == 0) {
-		*ngrp = cred->cr_ngroups;
-		return (0);
+	ngrp = cred->cr_ngroups;
+
+	if (uap->gidsetsize == 0) {
+		error = 0;
+		goto out;
 	}
-	if (*ngrp < cred->cr_ngroups)
+	if (uap->gidsetsize < ngrp)
 		return (EINVAL);
-	*ngrp = cred->cr_ngroups;
-	bcopy(cred->cr_groups, groups, *ngrp * sizeof(gid_t));
-	return (0);
+
+	error = copyout(cred->cr_groups, uap->gidset, ngrp * sizeof(gid_t));
+out:
+	td->td_retval[0] = ngrp;
+	return (error);
 }
 
 #ifndef _SYS_SYSPROTO_H_

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h	Tue Oct 21 23:07:30 2014	(r273435)
+++ head/sys/sys/syscallsubr.h	Tue Oct 21 23:08:46 2014	(r273436)
@@ -109,7 +109,6 @@ int	kern_getdirentries(struct thread *td
 	    long *basep, ssize_t *residp, enum uio_seg bufseg);
 int	kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
 	    enum uio_seg bufseg, int flags);
-int	kern_getgroups(struct thread *td, u_int *ngrp, gid_t *groups);
 int	kern_getitimer(struct thread *, u_int, struct itimerval *);
 int	kern_getppid(struct thread *);
 int	kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,


More information about the svn-src-head mailing list