Fix lock inversion bug.
To avoid deadlocking, we need to ensure consistent lock ordering,
and we nominate mDirectoryCache to be a finer-grain lock when compared
to database transactions.
Bug: 154107764
Test: atest --test-mapping packages/providers/MediaProvider
Change-Id: Ide47ca8c067f1f416b119011203c3b5fb82531b9
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 37d1e17..9d21b07 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -3991,19 +3991,19 @@
*/
private int deleteRecursive(SQLiteQueryBuilder qb, DatabaseHelper helper, String userWhere,
String[] userWhereArgs) {
- synchronized (mDirectoryCache) {
- mDirectoryCache.clear();
+ return (int) helper.runWithTransaction((db) -> {
+ synchronized (mDirectoryCache) {
+ mDirectoryCache.clear();
+ }
- return (int) helper.runWithTransaction((db) -> {
- int n = 0;
- int total = 0;
- do {
- n = qb.delete(helper, userWhere, userWhereArgs);
- total += n;
- } while (n > 0);
- return total;
- });
- }
+ int n = 0;
+ int total = 0;
+ do {
+ n = qb.delete(helper, userWhere, userWhereArgs);
+ total += n;
+ } while (n > 0);
+ return total;
+ });
}
@Override