From f58793c5a197d48f926f7cf7302c9bebff750196 Mon Sep 17 00:00:00 2001 From: tiansiming Date: Sun, 3 Sep 2017 16:48:34 +0800 Subject: [PATCH] Fix AddAccountSettings memory leak The memory leak will always occur in AddAccoutSettings when a null Bundle is returned in the addAccount we implement. Bug: https://issuetracker.google.com/issues/65322371 Test: Install the app through the github i have offered in above link, then press the "Test" item in ChooseAccountActivity (adb shell am start -n 'com.android.settings/.accounts.ChooseAccountActivity') serveal times. Check the activity number by "adb shell dumpsys meminfo com.android.settings". Change-Id: I3f139fe059e6094e9e5bf1660946ebc8bab6d090 Signed-off-by: tiansiming --- core/java/android/accounts/AbstractAccountAuthenticator.java | 3 +++ core/java/android/accounts/AccountManager.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/core/java/android/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java index 87e512c31bfa5..7ca65a41f85e7 100644 --- a/core/java/android/accounts/AbstractAccountAuthenticator.java +++ b/core/java/android/accounts/AbstractAccountAuthenticator.java @@ -175,6 +175,9 @@ public abstract class AbstractAccountAuthenticator { } if (result != null) { response.onResult(result); + } else { + response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, + "null bundle returned"); } } catch (Exception e) { handleException(response, "addAccount", accountType, e); diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index a446296fe393e..d22e268dad5bc 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -2318,6 +2318,10 @@ public class AccountManager { private class Response extends IAccountManagerResponse.Stub { @Override public void onResult(Bundle bundle) { + if (bundle == null) { + onError(ERROR_CODE_INVALID_RESPONSE, "null bundle returned"); + return; + } Intent intent = bundle.getParcelable(KEY_INTENT); if (intent != null && mActivity != null) { // since the user provided an Activity we will silently start intents