Re: [PATCH 2/13] Small preparations for namespaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Pavel Emelianov (xemul@xxxxxxxxxx):
> Serge E. Hallyn wrote:
> > Quoting Pavel Emelianov (xemul@xxxxxxxxxx):
> >> Serge E. Hallyn wrote:
> >>> Quoting Pavel Emelianov (xemul@xxxxxxxxxx):
> >>>> This includes #ifdefs in get/put_pid_ns and rewriting
> >>>> the child_reaper() function to the more logical view.
> >>>>
> >>>> This doesn't fit logically into any other patch so
> >>>> I decided to make it separate.
> >>>>
> >>>> Signed-off-by: Pavel Emelianov <xemul@xxxxxxxxxx>
> >>>>
> >>>> ---
> >>>>
> >>>> diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
> >>>> index 169c6c2..7af7191 100644
> >>>> --- a/include/linux/pid_namespace.h
> >>>> +++ b/include/linux/pid_namespace.h
> >>>> @@ -26,7 +26,9 @@ extern struct pid_namespace init_pid_ns;
> >>>>
> >>>>  static inline void get_pid_ns(struct pid_namespace *ns)
> >>>>  {
> >>>> +#ifdef CONFIG_PID_NS
> >>>>  	kref_get(&ns->kref);
> >>>> +#endif
> >>>>  }
> >>>>
> >>>>  extern struct pid_namespace *copy_pid_ns(int flags, struct pid_namespace *ns);
> >>>> @@ -34,12 +36,15 @@ extern void free_pid_ns(struct kref *kre
> >>>>
> >>>>  static inline void put_pid_ns(struct pid_namespace *ns)
> >>>>  {
> >>>> +#ifdef CONFIG_PID_NS
> >>>>  	kref_put(&ns->kref, free_pid_ns);
> >>>> +#endif
> >>>>  }
> >>>>
> >>>>  static inline struct task_struct *child_reaper(struct task_struct *tsk)
> >>>>  {
> >>>> -	return init_pid_ns.child_reaper;
> >>>> +	BUG_ON(tsk != current);
> >>>> +	return tsk->nsproxy->pid_ns->child_reaper;
> >>>>  }
> >>>>
> >>>>  #endif /* _LINUX_PID_NS_H */
> >>> This can't be bisect-safe, right?  You can't just use
> >>> tsk->nsproxy->pid_ns, as you've pointed out yourself.
> >> I can :) See - I have a proving BUG_ON() here.
> > 
> > I didn't know BUG_ON()'s actually warded off bugs  :)
> 
> It does not, but it says to code reader that this call
> expects something special. In this case - tsk is expected
> to be current always. And it is.

I don't think that's sufficient.

It's been awhile so I'm fuzzy on the details, but I think we only fixed
the race by always returning init_pid_ns instead of tsk->nsproxy_pid_ns,
and tsk being current is not safe.

> > You've tested this with the infamous NFS testcase?
> 
> What testcase do you mean?

http://lkml.org/lkml/2007/1/17/65

> > I don't see *why* it would work for you, but if you claim it does, I
> > guess you'd know better than I  :)
> 
> I don't get you here. I've checked that the task passed to
> child_reaper is current always. This BUG_ON prevents later
> code from passing arbitrary task to it.

I don't think that's enough.

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

[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux