diff options
author | 2023-03-23 17:43:24 -0700 | |
---|---|---|
committer | 2023-07-11 13:06:19 -0700 | |
commit | b9ef411d0f480ee59d73601cce7fb40335a7d389 (patch) | |
tree | 64fee0bc876701f8336b0fe4f6fbaa51b0b6b464 | |
parent | 82883c241c079b5941f96e662f8b9ea6bb8d2e5b (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.java | 5 | ||||
-rw-r--r-- | core/java/android/content/res/StringBlock.java | 3 | ||||
-rw-r--r-- | core/java/android/content/res/XmlBlock.java | 4 |
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; |