summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorThomas Wood <thomas.wood@intel.com>2015-07-16 17:39:59 +0100
committerThomas Wood <thomas.wood@intel.com>2015-07-20 18:13:37 +0100
commite65c69b995590ccd7f209b1e516819b1248d4e38 (patch)
treedfeac7981a64e75e666f94ace1cbcfc39b198170 /lib
parent51576b7ad67074bbee6da0e0ff96d783dbd4ea3f (diff)
lib: exit immediately if igt_fail is called in an exit handler
Exit immediately if the test is already exiting and igt_fail is called. This can happen if an igt_assert fails in an exit handler. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91349 Signed-off-by: Thomas Wood <thomas.wood@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_core.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/igt_core.c b/lib/igt_core.c
index 1a453d73..af3d8731 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -221,6 +221,7 @@ static const char *in_subtest = NULL;
static struct timespec subtest_time;
static bool in_fixture = false;
static bool test_with_subtests = false;
+static bool in_atexit_handler = false;
static enum {
CONT = 0, SKIP, FAIL
} skip_subtests_henceforth = CONT;
@@ -945,6 +946,11 @@ void igt_fail(int exitcode)
igt_debug_wait_for_keypress("failure");
+ /* Exit immediately if the test is already exiting and igt_fail is
+ * called. This can happen if an igt_assert fails in an exit handler */
+ if (in_atexit_handler)
+ _exit(IGT_EXIT_FAILURE);
+
if (!failed_one)
igt_exitcode = exitcode;
@@ -1410,6 +1416,8 @@ static void call_exit_handlers(int sig)
static void igt_atexit_handler(void)
{
+ in_atexit_handler = true;
+
restore_all_sig_handler();
if (!exit_handler_disabled)