OSDN Git Service

Check startup_future before using it
authorBailey Forrest <bcf@google.com>
Thu, 2 Aug 2018 22:10:46 +0000 (15:10 -0700)
committerBailey Forrest <bcf@google.com>
Tue, 14 Aug 2018 21:56:28 +0000 (14:56 -0700)
event_finish_startup and startup_timer_expired can race, leading one of
them to try to use startup_future when it is NULL.

Check startup_future still exists before using it.

Bug: 112114060
Test: Use Bluetooth
Change-Id: I018d45f070b3f931c1114abf0471b6ea1d524f2a

hci/src/hci_layer.cc

index aa012d6..00348c2 100644 (file)
@@ -342,6 +342,9 @@ static void event_finish_startup(UNUSED_ATTR void* context) {
   std::lock_guard<std::recursive_timed_mutex> lock(
       commands_pending_response_mutex);
   alarm_cancel(startup_timer);
+  if (!startup_future) {
+    return;
+  }
   future_ready(startup_future, FUTURE_SUCCESS);
   startup_future = NULL;
 }
@@ -358,9 +361,11 @@ static void startup_timer_expired(UNUSED_ATTR void* context) {
     // hence abort.
     abort();
   }
+  if (!startup_future) {
+    return;
+  }
   future_ready(startup_future, FUTURE_FAIL);
   startup_future = NULL;
-  lock.unlock();
 }
 
 // Command/packet transmitting functions