Commit 9a22d3df authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

pstree: workaround stupidity of modern compilers

gcc v6.0  and clang think that &next->pid.node can't be null.

Here is an explanation from a kernel log (v3.12-5097-g1310a5a):
"""
the result of this expression is not defined by a C standard
and some gcc versions (e.g.  4.3.4) assume the above expression can never
be equal to NULL.  The net result is an oops because the iteration is not
properly terminated.
"""

$ gcc -v
gcc version 6.0.0 20160406 (Red Hat 6.0.0-0.20) (GCC)
$ python test/zdtm.py run  -t zdtm/static/session00
...
$ gdb -c /tmp/core.61 criu/criu
Program terminated with signal SIGSEGV, Segmentation fault.
598			if (&next->pid.node == NULL || next->pid.virt > pid)

$ make CC=clang
pstree.c:598:18: error: comparison of address of 'next->pid.node' equal to a null pointer is always false [-Werror,-Wtautological-pointer-compare]
                if (&next->pid.node == NULL || next->pid.virt > pid)
Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent bfe7f6dc
...@@ -596,12 +596,17 @@ static int get_free_pid() ...@@ -596,12 +596,17 @@ static int get_free_pid()
prev = rb_entry(rb_first(&pid_root_rb), struct pstree_item, pid.node); prev = rb_entry(rb_first(&pid_root_rb), struct pstree_item, pid.node);
while (1) { while (1) {
struct rb_node *node;
pid_t pid; pid_t pid;
pid = prev->pid.virt + 1; pid = prev->pid.virt + 1;
pid = pid < RESERVED_PIDS ? RESERVED_PIDS + 1 : pid; pid = pid < RESERVED_PIDS ? RESERVED_PIDS + 1 : pid;
next = rb_entry(rb_next(&prev->pid.node), struct pstree_item, pid.node); node = rb_next(&prev->pid.node);
if (&next->pid.node == NULL || next->pid.virt > pid) if (node == NULL)
return pid;
next = rb_entry(node, struct pstree_item, pid.node);
if (next->pid.virt > pid)
return pid; return pid;
prev = next; prev = next;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment