[CRIU] [PATCH] pstree: use RB_EMPTY_NODE to check that node is not linked
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Mon May 29 02:37:37 PDT 2017
note to avoid confusion: I've also sent these patch as 01 in scope of
patch-set "[PATCH 00/11] rework init child-reaper reparent handling for
pidnses" as the latter does not work without it it.
On 05/29/2017 12:27 PM, Kirill Tkhai wrote:
> 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;
>> }
>>
--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.
More information about the CRIU
mailing list