Commit 63cb8b4d authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

zdtm/maps007: fix a race condition

If shm->delta = MAX_DELTA and we set shm->stop to 1, the child can exit
before the parent adds MAX_DELTA to shm->delta.

parent			child
shm->stop = 1
			if (shm->stop == 1 && shm->delta == MAX_DELTA)
				break
shm->delta += MAX_DELTA

Cc: Konstantin Neumoin <kneumoin@parallels.com>
Reported-by: 's avatarKonstantin Neumoin <kneumoin@parallels.com>
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f67fa36c
...@@ -73,17 +73,20 @@ int main(int argc, char **argv) ...@@ -73,17 +73,20 @@ int main(int argc, char **argv)
if (child) if (child)
test_daemon(); test_daemon();
while (test_go()) { while (1) {
void *ret; void *ret;
unsigned long size; unsigned long size;
int prot = PROT_NONE; int prot = PROT_NONE;
if (child) { if (child) {
if (!test_go())
break;
futex_wait_while_gt(&shm->delta, 2 * MAX_DELTA); futex_wait_while_gt(&shm->delta, 2 * MAX_DELTA);
futex_inc_and_wake(&shm->delta); futex_inc_and_wake(&shm->delta);
} else { } else {
if (!futex_get(&shm->stop)) if (!futex_get(&shm->stop))
futex_wait_while_lt(&shm->delta, MAX_DELTA); /* shm->delta must be always bigger than MAX_DELTA */
futex_wait_while_lt(&shm->delta, MAX_DELTA + 2);
if (futex_get(&shm->stop) && atomic_get(&shm->delta.raw) == MAX_DELTA) if (futex_get(&shm->stop) && atomic_get(&shm->delta.raw) == MAX_DELTA)
break; break;
...@@ -123,6 +126,8 @@ int main(int argc, char **argv) ...@@ -123,6 +126,8 @@ int main(int argc, char **argv)
test_msg("count %d\n", count); test_msg("count %d\n", count);
if (child == 0) { if (child == 0) {
if (!test_go())
err("unexpected state");
futex_set_and_wake(&shm->stop, 2); futex_set_and_wake(&shm->stop, 2);
test_waitsig(); test_waitsig();
} else { } else {
......
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