Hi,

while porting some NetBSD syscall tests to OpenBSD I noticed that the
getgroups test is failing. Simply put:

gid_t gidset[NGROUPS_MAX];
getgroups(-1, gidset);

This was fixed on NetBSD 8 years ago:
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/kern_prot.c
>       if (SCARG(uap, gidsetsize) < (int)*retval)
>               return EINVAL;

While here, also remove the u_int in setgroups. POSIX does't say a lot
about setgroups and therefore return EINVAL.
https://pubs.opengroup.org/onlinepubs/9699919799/

Index: sys/kern/kern_prot.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_prot.c,v
retrieving revision 1.75
diff -u -p -r1.75 kern_prot.c
--- sys/kern/kern_prot.c        22 Jun 2018 13:33:30 -0000      1.75
+++ sys/kern/kern_prot.c        8 Jul 2019 12:13:04 -0000
@@ -196,7 +196,7 @@ sys_getgroups(struct proc *p, void *v, r
                syscallarg(gid_t *) gidset;
        } */ *uap = v;
        struct ucred *uc = p->p_ucred;
-       u_int ngrp;
+       int ngrp;
        int error;
 
        if ((ngrp = SCARG(uap, gidsetsize)) == 0) {
@@ -870,13 +870,13 @@ sys_setgroups(struct proc *p, void *v, r
        struct process *pr = p->p_p;
        struct ucred *pruc, *newcred;
        gid_t groups[NGROUPS_MAX];
-       u_int ngrp;
+       int ngrp;
        int error;
 
        if ((error = suser(p)) != 0)
                return (error);
        ngrp = SCARG(uap, gidsetsize);
-       if (ngrp > NGROUPS_MAX)
+       if (ngrp > NGROUPS_MAX || ngrp < 0)
                return (EINVAL);
        error = copyin(SCARG(uap, gidset), groups, ngrp * sizeof(gid_t));
        if (error == 0) {

Reply via email to