diff options
Diffstat (limited to 'sys/kern/kern_proc.c')
| -rw-r--r-- | sys/kern/kern_proc.c | 16 | 
1 files changed, 10 insertions, 6 deletions
| diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 379fbda619c0..6e56664d12ce 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -1112,13 +1112,14 @@ fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp)  		if (cred->cr_flags & CRED_FLAG_CAPMODE)  			kp->ki_cr_flags |= KI_CRF_CAPABILITY_MODE;  		/* XXX bde doesn't like KI_NGROUPS */ -		if (cred->cr_ngroups > KI_NGROUPS) { +		if (1 + cred->cr_ngroups > KI_NGROUPS) {  			kp->ki_ngroups = KI_NGROUPS;  			kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;  		} else -			kp->ki_ngroups = cred->cr_ngroups; -		bcopy(cred->cr_groups, kp->ki_groups, -		    kp->ki_ngroups * sizeof(gid_t)); +			kp->ki_ngroups = 1 + cred->cr_ngroups; +		kp->ki_groups[0] = cred->cr_gid; +		bcopy(cred->cr_groups, kp->ki_groups + 1, +		    (kp->ki_ngroups - 1) * sizeof(gid_t));  		kp->ki_rgid = cred->cr_rgid;  		kp->ki_svgid = cred->cr_svgid;  		/* If jailed(cred), emulate the old P_JAILED flag. */ @@ -2943,8 +2944,11 @@ sysctl_kern_proc_groups(SYSCTL_HANDLER_ARGS)  	cred = crhold(p->p_ucred);  	PROC_UNLOCK(p); -	error = SYSCTL_OUT(req, cred->cr_groups, -	    cred->cr_ngroups * sizeof(gid_t)); +	error = SYSCTL_OUT(req, &cred->cr_gid, sizeof(gid_t)); +	if (error == 0) +		error = SYSCTL_OUT(req, cred->cr_groups, +		    cred->cr_ngroups * sizeof(gid_t)); +  	crfree(cred);  	return (error);  } | 
