[CRIU] [PATCH] pstree: use RB_EMPTY_NODE to check that node is not linked
Kirill Tkhai
ktkhai at virtuozzo.com
Mon May 29 02:27:27 PDT 2017
On 24.05.2017 17:50, Pavel Tikhomirov wrote:
> When new rb_root is created for pidns it is initialized with
> RB_ROOT, so ns->pid.rb_root.rb_node is NULL at first. Later
> then insert first node in lookup_create_pid() to these rb-tree
> it will have (NULL & color) in node->rb_parent_color.
>
> So the check "!rb_parent(&found->ns[i].node)" will be true for
> the rb-tree's root node, and criu will fail lookup these node.
>
> We haven't hit that yet as to get to these check we need task in
> at least two levels of pidns which at the same time is the root
> in rb-tree on e.g. level 0.
>
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> criu/pstree.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/criu/pstree.c b/criu/pstree.c
> index 3206cf1..efff3d7 100644
> --- a/criu/pstree.c
> +++ b/criu/pstree.c
> @@ -522,7 +522,7 @@ static struct pid *lookup_create_pid(pid_t *pid, int level, struct pid *pid_node
> found = find_pid_or_place_in_hier(&ns->pid.rb_root.rb_node, pid[level-1], level-1, &parent, &new);
> if (found) {
> for (i = level - 2; i >= 0; i--)
> - if (pid[i] != found->ns[i].virt || !rb_parent(&found->ns[i].node)) {
> + if (pid[i] != found->ns[i].virt || RB_EMPTY_NODE(&found->ns[i].node)) {
> pr_err("Wrong pid\n");
> return NULL;
> }
>
More information about the CRIU
mailing list