summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yurii Zubrytskyi <zyy@google.com> 2023-03-23 17:43:24 -0700
committer Yurii Zubrytskyi <zyy@google.com> 2023-07-11 13:06:19 -0700
commitb9ef411d0f480ee59d73601cce7fb40335a7d389 (patch)
tree64fee0bc876701f8336b0fe4f6fbaa51b0b6b464
parent82883c241c079b5941f96e662f8b9ea6bb8d2e5b (diff)
[res] Better native pointer tracking in Java
Make sure we clear the native pointers when freeing them, so any race condition that calls into it gets a null instead of calling into already freed object Bug: 197260547 Test: build + unit tests (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7c2f195cfc8c02403d61a394213398d13584a5de) Merged-In: I817dc2f5ef24e1fafeba3ce4c1c440abe70ad3ed Change-Id: I817dc2f5ef24e1fafeba3ce4c1c440abe70ad3ed
-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;