[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) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:b9ef411d0f480ee59d73601cce7fb40335a7d389) Merged-In: I817dc2f5ef24e1fafeba3ce4c1c440abe70ad3ed Change-Id: I817dc2f5ef24e1fafeba3ce4c1c440abe70ad3ed
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index ef3842a..0f284f4 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java
@@ -528,6 +528,10 @@ 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 @@ 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 6c07356..c143acb 100644 --- a/core/java/android/content/res/StringBlock.java +++ b/core/java/android/content/res/StringBlock.java
@@ -62,7 +62,7 @@ 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 @@ 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 3915a6c..16fd1f7 100644 --- a/core/java/android/content/res/XmlBlock.java +++ b/core/java/android/content/res/XmlBlock.java
@@ -73,7 +73,9 @@ private void decOpenCountLocked() { mOpenCount--; if (mOpenCount == 0) { + mStrings.close(); nativeDestroy(mNative); + mNative = 0; if (mAssets != null) { mAssets.xmlBlockGone(hashCode()); } @@ -621,7 +623,7 @@ } 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;