Re: 2.6.2-rc2-mm2

From: Andrew Morton
Date: Fri Jan 30 2004 - 15:33:07 EST


Tim Hockin <thockin@xxxxxxx> wrote:
>
> On Fri, Jan 30, 2004 at 11:47:01AM -0800, Andrew Morton wrote:
> > > directly calling sys_ANYTHING sounds really wrong to me...
>
> It sounded wrong to me, but it gets done ALL OVER.
>
> > Tim, I do think it would be neater to add another entry point in sys.c for
> > nfsd and just do a memcpy.
>
> Do you prefer:
>
> a) make a function
> sys.c: ksetgroups(int gidsetsize, gid_t *grouplist)
> which does the same as sys_setgroups, but without the copy_from_user()
> stuff? The only user (for now, maybe ever) is nfsd.
>
> b) make a function
> sys.c: nfsd_setgroups(int gidsetsize, gid_t *grouplist)
> which does the same as sys_setgroups, but without the copy_from_user()
>
> c) make the nfsd code build a struct group_info and call
> set_current_groups()
>

Can we do d)?

static long do_setgroups(int gidsetsize, gid_t __user *user_grouplist,
gid_t *kern_grouplist)
{
gid_t groups[NGROUPS];
int retval;

if (!capable(CAP_SETGID))
return -EPERM;
if ((unsigned) gidsetsize > NGROUPS)
return -EINVAL;
if (user_grouplist) {
if (copy_from_user(groups, user_grouplist,
gidsetsize * sizeof(gid_t)))
return -EFAULT;
} else {
memcpy(groups, kern_grouplist, gidsetsize * sizeof(gid_t));
}
retval = security_task_setgroups(gidsetsize, groups);
if (retval)
return retval;
memcpy(current->groups, groups, gidsetsize * sizeof(gid_t));
current->ngroups = gidsetsize;
return 0;
}

asmlinkage long sys_setgroups(int gidsetsize, gid_t __user *grouplist)
{
return do_setgroups(gidsetsize, grouplist, NULL);
}

long kern_setgroups(int gidsetsize, gid_t *grouplist)
{
return do_setgroups(gidsetsize, NULL, grouplist);
}

It's a bit grubby, but the grubbiness is localised.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/