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