This function must provide guarantees for readers, that
ve_ns != NULL under rcu_read_lock means the rest of context
(say, ve->init_task) is table.

But now order is wrong, and it does not guarantee that. Fix it.

v2: Use local variable for ve_ns, otherwise net_ns write results
in NULL pointer derefence.

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 kernel/ve/ve.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index db26cbd41d3f..cfc3039bb85b 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -579,15 +579,18 @@ static void ve_stop_kthread(struct ve_struct *ve)
 static void ve_grab_context(struct ve_struct *ve)
 {
        struct task_struct *tsk = current;
+       struct nsproxy *ve_ns;
 
        get_task_struct(tsk);
        ve->init_task = tsk;
        ve->root_css_set = tsk->cgroups;
        get_css_set(ve->root_css_set);
        ve->init_cred = (struct cred *)get_current_cred();
-       rcu_assign_pointer(ve->ve_ns, get_nsproxy(tsk->nsproxy));
-       ve->ve_netns =  get_net(ve->ve_ns->net_ns);
+       ve_ns = get_nsproxy(tsk->nsproxy);
+       ve->ve_netns =  get_net(ve_ns->net_ns);
        synchronize_rcu();
+
+       rcu_assign_pointer(ve->ve_ns, ve_ns);
 }
 
 static void ve_drop_context(struct ve_struct *ve)


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

Reply via email to