fix an NPE on a race condition that occurs when unbinding from an authenticator at the samer time that its process dies: bug 2171204
diff --git a/core/java/android/accounts/AuthenticatorBindHelper.java b/core/java/android/accounts/AuthenticatorBindHelper.java
index 91e23ab..2ca1f0e 100644
--- a/core/java/android/accounts/AuthenticatorBindHelper.java
+++ b/core/java/android/accounts/AuthenticatorBindHelper.java
@@ -146,7 +146,7 @@
                                 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 @@
         }
     }
 
-    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,15 +220,18 @@
             // 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)) {
-                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                        Log.v(TAG, "the service became disconnected, scheduling a "
-                                + "disconnected message for "
-                                + 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 "
+                                    + mAuthenticatorType);
+                        }
+                        mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
                     }
-                    mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
+                    unbindFromServiceLocked(mAuthenticatorType);
                 }
-                unbindFromService(mAuthenticatorType);
             }
         }
     }