[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
<e4ii9s.skooc0.3aq6g4-qmf@mail-nwsmtp-smtp-production-main-19.klg.yp-c.yandex.net>
Date: Tue, 1 Oct 2024 15:28:44 +0000
From: stsp <stsp2@...dex.ru>
To: oleg@...hat.com
Cc:
viro@...iv.linux.org.uk,brauner@...nel.org,jack@...e.cz,axboe@...nel.dk,akpm@...ux-foundation.org,catalin.marinas@....com,revest@...omium.org,kees@...nel.org,palmer@...osinc.com,charlie@...osinc.com,bgray@...ux.ibm.com,deller@....de,zev@...ilderbeest.net,samuel.holland@...ive.com,linux-fsdevel@...r.kernel.org,ebiederm@...ssion.com,luto@...nel.org,josh@...htriplett.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3] add group restriction bitmap
Вторник, 1 октября 2024 г получено от Oleg Nesterov:
> We can't understand each other. I guess I missed something...
>
> On 10/01, stsp wrote:
> >
> > 01.10.2024 16:02, Oleg Nesterov пишет:
> > >On 10/01, stsp wrote:
> > >>01.10.2024 14:15, Oleg Nesterov пишет:
> > >>>Suppose we change groups_search()
> > >>>
> > >>> --- a/kernel/groups.c
> > >>> +++ b/kernel/groups.c
> > >>> @@ -104,8 +104,11 @@ int groups_search(const struct group_info *group_info, kgid_t grp)
> > >>> left = mid + 1;
> > >>> else if (gid_lt(grp, group_info->gid[mid]))
> > >>> right = mid;
> > >>> - else
> > >>> - return 1;
> > >>> + else {
> > >>> + bool r = mid < BITS_PER_LONG &&
> > >>> + test_bit(mid, &group_info->restrict_bitmap);
> > >>> + return r ? -1 : 1;
> > >>> + }
> > >>> }
> > >>> return 0;
> > >>> }
> > >>>
> > >>>so that it returns, say, -1 if the found grp is restricted.
> > >>>
> > >>>Then everything else can be greatly simplified, afaics...
> > >>This will mean updating all callers
> > >>of groups_search(), in_group_p(),
> > >>in_egroup_p(), vfsxx_in_group_p()
> > >Why? I think with this change you do not need to touch in_group_p/etc at all.
> > >
> > >>if in_group_p() returns -1 for not found
> > >>and 0 for gid,
> > >With the the change above in_group_p() returns 0 if not found, !0 otherwise.
> > >It returns -1 if grp != cred->fsgid and the found grp is restricted.
> >
> > in_group_p() doesn't check if the
> > group is restricted or not.
>
> And it shouldn't. It returns the result of groups_search() if this
> grp is supplementary or "not found".
>
> > acl_permission_check() does, but
> > in your example it doesn't as well.
>
> But it does??? see below...
>
> > I think you mean to move the
> > restrict_bitmap check upwards to
> > in_group_p()?
>
> No, I meant to move the restrict_bitmap check to groups_search(), see the patch
> above.
Ah, I see now!
Sorry.
I didn't expect to move that check
that far, so I thought you mean just
make groups_search() 0-based and
-1 if not found... even if you said
otherwise.
Yes, -1 when found but restricted
is the very interesting simplification!
Will send an update.
Thanks.
>
> > Anyway, suppose you don't mean that.
> > In this case:
> > 1. in_group_p() and in_egroup_p()
> > should be changed:
> > - int retval = 1;
> > + int retval = -1;
>
> Why? -1 means that the grp is supplementary and restricted.
>
> > There are also the callers of groups_search()
> > in kernel/auditsc.c and they should
> > be updated.
>
> Why? I don't think so. audit_filter_rules() uses the result of groups_search()
> as a boolean.
>
> > >So acl_permission_check() can simply do
> > >
> > > if (mask & (mode ^ (mode >> 3))) {
> > > vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
> > > int xxx = vfsgid_in_group_p(vfsgid);
> > >
> > > if (xxx) {
> > > if (mask & ~(mode >> 3))
> > > return -EACCES;
> > > if (xxx > 0)
> > > return 0;
> > > /* If we hit restrict_bitmap, then check Others. */
> > > }
> > > }
> >
> > Well, in my impl it should check
> > the bitmap right here, but you removed
> > that.
>
> No, I didn't remove the check, this code relies on the change in
> groups_search(). Note the "xxx > 0" check.
>
> I must have missed something :/
>
> Oleg.
>
>
Powered by blists - more mailing lists