Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea48361d authored by Fred Quintana's avatar Fred Quintana
Browse files

fix an NPE on a race condition that occurs when unbinding from an...

fix an NPE on a race condition that occurs when unbinding from an authenticator at the samer time that its process dies: bug 2171204
parent f038004f
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ public class AuthenticatorBindHelper {
                                Log.v(TAG, "there are no more callbacks for service "
                                        + authenticatorType + ", unbinding service");
                            }
                            unbindFromService(authenticatorType);
                            unbindFromServiceLocked(authenticatorType);
                        } else {
                            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                                Log.v(TAG, "leaving service " + authenticatorType
@@ -161,7 +161,10 @@ public class AuthenticatorBindHelper {
        }
    }

    private void unbindFromService(String authenticatorType) {
    /**
     * You must synchronized on mServiceConnections before calling this
     */
    private void unbindFromServiceLocked(String authenticatorType) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, "unbindService from " + authenticatorType);
        }
@@ -217,7 +220,9 @@ public class AuthenticatorBindHelper {
            // post a message for each service user to tell them that the service is disconnected,
            // and unbind from the service.
            synchronized (mServiceConnections) {
                for (Callback callback : mServiceUsers.get(mAuthenticatorType)) {
                final ArrayList<Callback> callbackList = mServiceUsers.get(mAuthenticatorType);
                if (callbackList != null) {
                    for (Callback callback : callbackList) {
                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
                            Log.v(TAG, "the service became disconnected, scheduling a "
                                    + "disconnected message for "
@@ -225,7 +230,8 @@ public class AuthenticatorBindHelper {
                        }
                        mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
                    }
                unbindFromService(mAuthenticatorType);
                    unbindFromServiceLocked(mAuthenticatorType);
                }
            }
        }
    }