Merge "Remove libhwbinder/libhidltransport deps"
diff --git a/libfiemap/image_manager.cpp b/libfiemap/image_manager.cpp
index 24c7f12..3e32dcf 100644
--- a/libfiemap/image_manager.cpp
+++ b/libfiemap/image_manager.cpp
@@ -633,5 +633,17 @@
     manager_->UnmapImageDevice(name_);
 }
 
+bool IImageManager::UnmapImageIfExists(const std::string& name) {
+    // No lock is needed even though this seems to be vulnerable to TOCTOU. If process A
+    // calls MapImageDevice() while process B calls UnmapImageIfExists(), and MapImageDevice()
+    // happens after process B checks IsImageMapped(), it would be as if MapImageDevice() is called
+    // after process B finishes calling UnmapImageIfExists(), resulting the image to be mapped,
+    // which is a reasonable sequence.
+    if (!IsImageMapped(name)) {
+        return true;
+    }
+    return UnmapImageDevice(name);
+}
+
 }  // namespace fiemap
 }  // namespace android
diff --git a/libfiemap/include/libfiemap/image_manager.h b/libfiemap/include/libfiemap/image_manager.h
index e61cdac..efbe9bd 100644
--- a/libfiemap/include/libfiemap/image_manager.h
+++ b/libfiemap/include/libfiemap/image_manager.h
@@ -90,6 +90,8 @@
     // Writes |bytes| zeros to |name| file. If |bytes| is 0, then the
     // whole file if filled with zeros.
     virtual bool ZeroFillNewImage(const std::string& name, uint64_t bytes) = 0;
+
+    virtual bool UnmapImageIfExists(const std::string& name);
 };
 
 class ImageManager final : public IImageManager {