diff mbox series

[v2,09/10] hciemu: Fix crash when test is aborted during pre setup

Message ID 20201111230421.3364932-10-luiz.dentz@gmail.com (mailing list archive)
State New, archived
Headers show
Series Testers/Emulator overhaul | expand

Commit Message

Luiz Augusto von Dentz Nov. 11, 2020, 11:04 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

If the tester_pre_setup_failed is called all timeout related to the
test must be cancelled as the test should have been freed by the
application and the next test is about to start.
---
 emulator/hciemu.c   | 8 +++++++-
 src/shared/tester.c | 5 +++++
 2 files changed, 12 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/emulator/hciemu.c b/emulator/hciemu.c
index fd6029deb..961de6359 100644
--- a/emulator/hciemu.c
+++ b/emulator/hciemu.c
@@ -43,6 +43,7 @@  struct hciemu {
 	guint host_source;
 	guint master_source;
 	guint client_source;
+	guint start_source;
 	struct queue *post_command_hooks;
 	char bdaddr_str[18];
 
@@ -297,6 +298,8 @@  static gboolean start_stack(gpointer user_data)
 {
 	struct hciemu *hciemu = user_data;
 
+	hciemu->start_source = 0;
+
 	bthost_start(hciemu->host_stack);
 
 	return FALSE;
@@ -353,7 +356,7 @@  struct hciemu *hciemu_new(enum hciemu_type type)
 		return NULL;
 	}
 
-	g_idle_add(start_stack, hciemu);
+	hciemu->start_source = g_idle_add(start_stack, hciemu);
 
 	return hciemu_ref(hciemu);
 }
@@ -378,6 +381,9 @@  void hciemu_unref(struct hciemu *hciemu)
 
 	queue_destroy(hciemu->post_command_hooks, destroy_command_hook);
 
+	if (hciemu->start_source)
+		g_source_remove(hciemu->start_source);
+
 	g_source_remove(hciemu->host_source);
 	g_source_remove(hciemu->client_source);
 	g_source_remove(hciemu->master_source);
diff --git a/src/shared/tester.c b/src/shared/tester.c
index 0c31e8b1c..af33a79cd 100644
--- a/src/shared/tester.c
+++ b/src/shared/tester.c
@@ -541,6 +541,11 @@  void tester_pre_setup_failed(void)
 	if (test->stage != TEST_STAGE_PRE_SETUP)
 		return;
 
+	if (test->timeout_id > 0) {
+		g_source_remove(test->timeout_id);
+		test->timeout_id = 0;
+	}
+
 	print_progress(test->name, COLOR_RED, "pre setup failed");
 
 	g_idle_add(done_callback, test);