summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yurii Zubrytskyi <zyy@google.com> 2023-08-30 20:54:09 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-08-30 20:54:09 +0000
commit11cbc92e8525138f5220bda7f555828b0eabcce9 (patch)
tree50c3549b376b73971ba8c0aec43030b424d273f6
parent50b9de5fe3b9863818d595dbbf21185bb9163e68 (diff)
parentb9ef411d0f480ee59d73601cce7fb40335a7d389 (diff)
[res] Better native pointer tracking in Java am: b9ef411d0f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23987679 Change-Id: I50d90e6fd7f91f680c8cdc01dc9c24c24bd716f6 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--core/java/android/content/res/AssetManager.java5
-rw-r--r--core/java/android/content/res/StringBlock.java3
-rw-r--r--core/java/android/content/res/XmlBlock.java4
3 files changed, 10 insertions, 2 deletions
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index ef3842aeb348..0f284f491c29 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -528,6 +528,10 @@ public final class AssetManager implements AutoCloseable {
if (!mOpen) {
throw new RuntimeException("AssetManager has been closed");
}
+ // Let's still check if the native object exists, given all the memory corruptions.
+ if (mObject == 0) {
+ throw new RuntimeException("AssetManager is open but the native object is gone");
+ }
}
/**
@@ -1153,6 +1157,7 @@ public final class AssetManager implements AutoCloseable {
int[] getAttributeResolutionStack(long themePtr, @AttrRes int defStyleAttr,
@StyleRes int defStyleRes, @StyleRes int xmlStyle) {
synchronized (this) {
+ ensureValidLocked();
return nativeAttributeResolutionStack(
mObject, themePtr, xmlStyle, defStyleAttr, defStyleRes);
}
diff --git a/core/java/android/content/res/StringBlock.java b/core/java/android/content/res/StringBlock.java
index 6c0735692db9..c143acb34c5f 100644
--- a/core/java/android/content/res/StringBlock.java
+++ b/core/java/android/content/res/StringBlock.java
@@ -62,7 +62,7 @@ public final class StringBlock implements Closeable {
private static final String TAG = "AssetManager";
private static final boolean localLOGV = false;
- private final long mNative;
+ private long mNative; // final, but gets modified when closed
private final boolean mUseSparse;
private final boolean mOwnsNative;
@@ -207,6 +207,7 @@ public final class StringBlock implements Closeable {
if (mOwnsNative) {
nativeDestroy(mNative);
}
+ mNative = 0;
}
}
}
diff --git a/core/java/android/content/res/XmlBlock.java b/core/java/android/content/res/XmlBlock.java
index 3915a6ccb46d..16fd1f7277a7 100644
--- a/core/java/android/content/res/XmlBlock.java
+++ b/core/java/android/content/res/XmlBlock.java
@@ -73,7 +73,9 @@ public final class XmlBlock implements AutoCloseable {
private void decOpenCountLocked() {
mOpenCount--;
if (mOpenCount == 0) {
+ mStrings.close();
nativeDestroy(mNative);
+ mNative = 0;
if (mAssets != null) {
mAssets.xmlBlockGone(hashCode());
}
@@ -621,7 +623,7 @@ public final class XmlBlock implements AutoCloseable {
}
private @Nullable final AssetManager mAssets;
- private final long mNative;
+ private long mNative; // final, but gets reset on close
/*package*/ final StringBlock mStrings;
private boolean mOpen = true;
private int mOpenCount = 1;