Quoting Eric W. Biederman (ebied...@xmission.com):
> "Serge E. Hallyn" <se...@us.ibm.com> writes:
> 
> > Quoting Eric W. Biederman (ebied...@xmission.com):
> >> 
> >> I have take an snapshot of my development tree and placed it at.
> >> 
> >> 
> >> git://git.kernel.org/pub/scm/linux/people/ebiederm/linux-2.6.33-nsfd-v5.git
> >> 
> >> 
> >> >> I am going to explore a bit more.  Given that nsfd is using the same
> >> >> permission checks as a proc file, I think I can just make it a proc
> >> >> file.  Something like "/proc/<pid>/ns/net".  With a little luck that
> >> >> won't suck too badly.
> >> >>   
> >> > Ah ! yes. Good idea.
> >> 
> >> It is a hair more code to use proc files but nothing worth counting.
> >> 
> >> Probably the biggest thing I am aware of right now in my development
> >> tree is in getting uids to pass properly between unix domain sockets
> >> I would up writing this cred_to_ucred function.
> >> 
> >> Serge can you take a look and check my logic, and do you have
> >> any idea of where we should place something like pid_vnr but
> >> for the uid namespace?
> >
> > Well my first thought was user_namespace, but I'm thinking kernel/cred.c is
> > the best place for it.
> 
> Thanks.
> 
> >> void cred_to_ucred(struct pid *pid, const struct cred *cred,
> >>               struct ucred *ucred)
> >> {
> >>    ucred->pid = pid_vnr(pid);
> >>    ucred->uid = ucred->gid = -1;
> >>    if (cred) {
> >>            struct user_namespace *cred_ns = cred->user->user_ns;
> >>            struct user_namespace *current_ns = current_user_ns();
> >>            struct user_namespace *tmp;
> >> 
> >>            if (likely(cred_ns == current_ns)) {
> >>                    ucred->uid = cred->euid;
> >>                    ucred->gid = cred->egid;
> >>            } else {
> >>                    /* Is cred in a child user namespace */
> >>                    tmp = cred_ns;
> >>                    do {
> >>                            tmp = tmp->creator->user_ns;
> >>                            if (tmp == current_ns) {
> >
> >     Hmm, I think you want to catch one level up - so the creator itself
> >     is in current_user_ns, so
> 
> >
> >     do {
> >             if (tmp->creator->user_ns == current_ns) {
> >                     ucred->uid = tmp->creator->uid;
> >                     ucred->gid = tmp->creator_gid;
> >                     return;
> >             }
> >             tmp = tmp->creator->user_ns;
> >     } while (tmp != &init_user_ns);
> 
> Good catch.  
> 
> >>                                    ucred->uid = tmp->creator->uid;
> >>                                    ucred->gid = overflowgid;
> >
> >                     should we start recording a user_ns->creator_gid
> >                     instead?
> 
> I had a similar question.  Possibly we can just grab the creators cred.

Oh, yeah, make user_ns->creator a cred, excellent idea - then we have
the LSM and capability fields cached as well.

-serge
_______________________________________________
Containers mailing list
contain...@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to