Run ImsSmsListener callbacks as self.

Earlier there was an implicit assumption that IMS (caller of the
callbacks) runs under the same uid, but that may not always be
true now.

Test: atest SmsManagerTest
Bug: 162487575
Merged-in: Ic0bb62c3b960fda8708e7bebefb1154a2380fd4f
Change-Id: Ic0bb62c3b960fda8708e7bebefb1154a2380fd4f
diff --git a/src/java/com/android/internal/telephony/ImsSmsDispatcher.java b/src/java/com/android/internal/telephony/ImsSmsDispatcher.java
index c99b282..54811ec 100644
--- a/src/java/com/android/internal/telephony/ImsSmsDispatcher.java
+++ b/src/java/com/android/internal/telephony/ImsSmsDispatcher.java
@@ -118,119 +118,135 @@
         @Override
         public void onSendSmsResult(int token, int messageRef, @SendStatusResult int status,
                 int reason, int networkReasonCode) {
-            logd("onSendSmsResult token=" + token + " messageRef=" + messageRef
-                    + " status=" + status + " reason=" + reason + " networkReasonCode="
-                    + networkReasonCode);
-            // TODO integrate networkReasonCode into IMS SMS metrics.
-            SmsTracker tracker = mTrackers.get(token);
-            mMetrics.writeOnImsServiceSmsSolicitedResponse(mPhone.getPhoneId(), status, reason,
-                    (tracker != null ? tracker.mMessageId : 0L));
-            if (tracker == null) {
-                throw new IllegalArgumentException("Invalid token.");
-            }
-            tracker.mMessageRef = messageRef;
-            switch(status) {
-                case ImsSmsImplBase.SEND_STATUS_OK:
-                    if (tracker.mDeliveryIntent == null) {
-                        // Remove the tracker here if a status report is not requested.
+            final long identity = Binder.clearCallingIdentity();
+            try {
+                logd("onSendSmsResult token=" + token + " messageRef=" + messageRef
+                        + " status=" + status + " reason=" + reason + " networkReasonCode="
+                        + networkReasonCode);
+                // TODO integrate networkReasonCode into IMS SMS metrics.
+                SmsTracker tracker = mTrackers.get(token);
+                mMetrics.writeOnImsServiceSmsSolicitedResponse(mPhone.getPhoneId(), status, reason,
+                        (tracker != null ? tracker.mMessageId : 0L));
+                if (tracker == null) {
+                    throw new IllegalArgumentException("Invalid token.");
+                }
+                tracker.mMessageRef = messageRef;
+                switch (status) {
+                    case ImsSmsImplBase.SEND_STATUS_OK:
+                        if (tracker.mDeliveryIntent == null) {
+                            // Remove the tracker here if a status report is not requested.
+                            mTrackers.remove(token);
+                        }
+                        tracker.onSent(mContext);
+                        mPhone.notifySmsSent(tracker.mDestAddress);
+                        break;
+                    case ImsSmsImplBase.SEND_STATUS_ERROR:
+                        tracker.onFailed(mContext, reason, networkReasonCode);
                         mTrackers.remove(token);
-                    }
-                    tracker.onSent(mContext);
-                    mPhone.notifySmsSent(tracker.mDestAddress);
-                    break;
-                case ImsSmsImplBase.SEND_STATUS_ERROR:
-                    tracker.onFailed(mContext, reason, networkReasonCode);
-                    mTrackers.remove(token);
-                    break;
-                case ImsSmsImplBase.SEND_STATUS_ERROR_RETRY:
-                    tracker.mRetryCount += 1;
-                    sendSms(tracker);
-                    break;
-                case ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK:
-                    tracker.mRetryCount += 1;
-                    fallbackToPstn(token, tracker);
-                    break;
-                default:
+                        break;
+                    case ImsSmsImplBase.SEND_STATUS_ERROR_RETRY:
+                        tracker.mRetryCount += 1;
+                        sendSms(tracker);
+                        break;
+                    case ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK:
+                        tracker.mRetryCount += 1;
+                        fallbackToPstn(token, tracker);
+                        break;
+                    default:
+                }
+            } finally {
+                Binder.restoreCallingIdentity(identity);
             }
         }
 
         @Override
         public void onSmsStatusReportReceived(int token, String format, byte[] pdu)
                 throws RemoteException {
-            logd("Status report received.");
-            android.telephony.SmsMessage message =
-                    android.telephony.SmsMessage.createFromPdu(pdu, format);
-            if (message == null || message.mWrappedSmsMessage == null) {
-                throw new RemoteException(
-                        "Status report received with a PDU that could not be parsed.");
-            }
-            int messageRef = message.mWrappedSmsMessage.mMessageRef;
-            SmsTracker tracker = null;
-            int key = 0;
-            for (Map.Entry<Integer, SmsTracker> entry : mTrackers.entrySet()) {
-                if (messageRef == ((SmsTracker) entry.getValue()).mMessageRef) {
-                    tracker = entry.getValue();
-                    key = entry.getKey();
-                    break;
-                }
-            }
-
-            if (tracker == null) {
-                throw new RemoteException("No tracker for messageRef " + messageRef);
-            }
-            Pair<Boolean, Boolean> result = mSmsDispatchersController.handleSmsStatusReport(
-                    tracker, format, pdu);
-            logd("Status report handle result, success: " + result.first
-                    + " complete: " + result.second);
+            final long identity = Binder.clearCallingIdentity();
             try {
-                getImsManager().acknowledgeSmsReport(
-                        token,
-                        messageRef,
-                        result.first ? ImsSmsImplBase.STATUS_REPORT_STATUS_OK
-                                : ImsSmsImplBase.STATUS_REPORT_STATUS_ERROR);
-            } catch (ImsException e) {
-                loge("Failed to acknowledgeSmsReport(). Error: "
-                        + e.getMessage());
-            }
-            if (result.second) {
-                mTrackers.remove(key);
+                logd("Status report received.");
+                android.telephony.SmsMessage message =
+                        android.telephony.SmsMessage.createFromPdu(pdu, format);
+                if (message == null || message.mWrappedSmsMessage == null) {
+                    throw new RemoteException(
+                            "Status report received with a PDU that could not be parsed.");
+                }
+                int messageRef = message.mWrappedSmsMessage.mMessageRef;
+                SmsTracker tracker = null;
+                int key = 0;
+                for (Map.Entry<Integer, SmsTracker> entry : mTrackers.entrySet()) {
+                    if (messageRef == ((SmsTracker) entry.getValue()).mMessageRef) {
+                        tracker = entry.getValue();
+                        key = entry.getKey();
+                        break;
+                    }
+                }
+
+                if (tracker == null) {
+                    throw new RemoteException("No tracker for messageRef " + messageRef);
+                }
+                Pair<Boolean, Boolean> result = mSmsDispatchersController.handleSmsStatusReport(
+                        tracker, format, pdu);
+                logd("Status report handle result, success: " + result.first
+                        + " complete: " + result.second);
+                try {
+                    getImsManager().acknowledgeSmsReport(
+                            token,
+                            messageRef,
+                            result.first ? ImsSmsImplBase.STATUS_REPORT_STATUS_OK
+                                    : ImsSmsImplBase.STATUS_REPORT_STATUS_ERROR);
+                } catch (ImsException e) {
+                    loge("Failed to acknowledgeSmsReport(). Error: "
+                            + e.getMessage());
+                }
+                if (result.second) {
+                    mTrackers.remove(key);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(identity);
             }
         }
 
         @Override
         public void onSmsReceived(int token, String format, byte[] pdu) {
-            logd("SMS received.");
-            android.telephony.SmsMessage message =
-                    android.telephony.SmsMessage.createFromPdu(pdu, format);
-            mSmsDispatchersController.injectSmsPdu(message, format, result -> {
-                logd("SMS handled result: " + result);
-                int mappedResult;
-                switch (result) {
-                    case Intents.RESULT_SMS_HANDLED:
-                        mappedResult = ImsSmsImplBase.DELIVER_STATUS_OK;
-                        break;
-                    case Intents.RESULT_SMS_OUT_OF_MEMORY:
-                        mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY;
-                        break;
-                    case Intents.RESULT_SMS_UNSUPPORTED:
-                        mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED;
-                        break;
-                    default:
-                        mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC;
-                        break;
-                }
-                try {
-                    if (message != null && message.mWrappedSmsMessage != null) {
-                        getImsManager().acknowledgeSms(token,
-                                message.mWrappedSmsMessage.mMessageRef, mappedResult);
-                    } else {
-                        logw("SMS Received with a PDU that could not be parsed.");
-                        getImsManager().acknowledgeSms(token, 0, mappedResult);
+            final long identity = Binder.clearCallingIdentity();
+            try {
+                logd("SMS received.");
+                android.telephony.SmsMessage message =
+                        android.telephony.SmsMessage.createFromPdu(pdu, format);
+                mSmsDispatchersController.injectSmsPdu(message, format, result -> {
+                    logd("SMS handled result: " + result);
+                    int mappedResult;
+                    switch (result) {
+                        case Intents.RESULT_SMS_HANDLED:
+                            mappedResult = ImsSmsImplBase.DELIVER_STATUS_OK;
+                            break;
+                        case Intents.RESULT_SMS_OUT_OF_MEMORY:
+                            mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY;
+                            break;
+                        case Intents.RESULT_SMS_UNSUPPORTED:
+                            mappedResult =
+                                    ImsSmsImplBase.DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED;
+                            break;
+                        default:
+                            mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC;
+                            break;
                     }
-                } catch (ImsException e) {
-                    loge("Failed to acknowledgeSms(). Error: " + e.getMessage());
-                }
-            }, true);
+                    try {
+                        if (message != null && message.mWrappedSmsMessage != null) {
+                            getImsManager().acknowledgeSms(token,
+                                    message.mWrappedSmsMessage.mMessageRef, mappedResult);
+                        } else {
+                            logw("SMS Received with a PDU that could not be parsed.");
+                            getImsManager().acknowledgeSms(token, 0, mappedResult);
+                        }
+                    } catch (ImsException e) {
+                        loge("Failed to acknowledgeSms(). Error: " + e.getMessage());
+                    }
+                }, true);
+            } finally {
+                Binder.restoreCallingIdentity(identity);
+            }
         }
     };