From 1d57f686a359d9a334ad856512049e55728ec57c Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Thu, 22 Aug 2019 09:51:18 -0700 Subject: [PATCH] Fix race condition is commitCheckpoint If cp_commitCheckpoint is called twice at the same time, the second call to setBowState will fail. Add lock to remove possibility, and protect all uses of isCheckpointing Bug: 138952436 Test: Boots after flashing in checkpoint mode Change-Id: I131298adc506c3c176774d15e642b13d5f991087 --- Checkpoint.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Checkpoint.cpp b/Checkpoint.cpp index 362c823..a2db4bd 100644 --- a/Checkpoint.cpp +++ b/Checkpoint.cpp @@ -144,9 +144,15 @@ Status cp_startCheckpoint(int retry) { namespace { volatile bool isCheckpointing = false; + +// Protects isCheckpointing and code that makes decisions based on status of +// isCheckpointing +std::mutex isCheckpointingLock; } Status cp_commitChanges() { + std::lock_guard lock(isCheckpointingLock); + if (!isCheckpointing) { return Status::ok(); } @@ -261,6 +267,7 @@ bool cp_needsCheckpoint() { std::string content; sp module = IBootControl::getService(); + std::lock_guard lock(isCheckpointingLock); if (isCheckpointing) return isCheckpointing; if (module && module->isSlotMarkedSuccessful(module->getCurrentSlot()) == BoolResult::FALSE) { @@ -330,6 +337,7 @@ static void cp_healthDaemon(std::string mnt_pnt, std::string blk_device, bool is } // namespace Status cp_prepareCheckpoint() { + std::lock_guard lock(isCheckpointingLock); if (!isCheckpointing) { return Status::ok(); }