"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.


>>                                      return;
>>                              }
>>                      } while (tmp != &init_user_ns);
>> 
>>                      /* Is cred the creator of my user namespace,
>>                       * or the creator of one of it's parents?
>>                       */
>>                      for( tmp = current_ns; tmp != &init_user_ns;
>>                           tmp = tmp->creator->user_ns) {
>>                              if (cred->user == tmp->creator) {
>>                                      ucred->uid = 0;
>>                                      ucred->gid = 0;
>>                                      return;
>>                              }
>>                      }
>
> That looks right.
>
>>                      /* No user namespace relationship so no mapping */
>>                      ucred->uid = overflowuid;
>>                      ucred->gid = overflowgid;
>>              }
>>      }
>> }

Eric

_______________________________________________
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