From e40b5acb2b773705d91494c3a1466365bf897253 Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Mon, 13 Feb 2017 11:58:11 -0800 Subject: [PATCH] Check return status for response callbacks. Test: Basic telephony sanity Bug: 32020264 Change-Id: I2b55b83834d43bf1803e2af05d409d0c8ea6186e --- libril/sap_service.cpp | 89 +++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/libril/sap_service.cpp b/libril/sap_service.cpp index 0af28e7..a46de4a 100644 --- a/libril/sap_service.cpp +++ b/libril/sap_service.cpp @@ -69,8 +69,20 @@ struct SapImpl : public ISap { Return addPayloadAndDispatchRequest(MsgHeader *msg, uint16_t reqLen, uint8_t *reqPtr); void sendFailedResponse(MsgId msgId, int32_t token, int numPointers, ...); + + void checkReturnStatus(Return& ret); }; +void SapImpl::checkReturnStatus(Return& ret) { + if (ret.isOk() == false) { + RLOGE("checkReturnStatus: unable to call response/indication callback"); + // Remote process (SapRilReceiver.java) hosting the callback must be dead. Reset the + // callback object; there's no other recovery to be done here. When the client process is + // back up, it will call setCallback() + sapCallback = NULL; + } +} + Return SapImpl::setCallback(const ::android::sp& sapCallbackParam) { RLOGD("SapImpl::setCallback for slotId %d", slotId); sapCallback = sapCallbackParam; @@ -122,45 +134,50 @@ void SapImpl::sendFailedResponse(MsgId msgId, int32_t token, int numPointers, .. if (ptr) free(ptr); } va_end(ap); + Return retStatus; switch(msgId) { case MsgId_RIL_SIM_SAP_CONNECT: - sapCallback->connectResponse(token, SapConnectRsp::CONNECT_FAILURE, 0); - return; + retStatus = sapCallback->connectResponse(token, SapConnectRsp::CONNECT_FAILURE, 0); + break; case MsgId_RIL_SIM_SAP_DISCONNECT: - sapCallback->disconnectResponse(token); - return; + retStatus = sapCallback->disconnectResponse(token); + break; case MsgId_RIL_SIM_SAP_APDU: { hidl_vec apduRsp; - sapCallback->apduResponse(token, SapResultCode::GENERIC_FAILURE, apduRsp); - return; + retStatus = sapCallback->apduResponse(token, SapResultCode::GENERIC_FAILURE, apduRsp); + break; } case MsgId_RIL_SIM_SAP_TRANSFER_ATR: { hidl_vec atr; - sapCallback->transferAtrResponse(token, SapResultCode::GENERIC_FAILURE, atr); - return; + retStatus = sapCallback->transferAtrResponse(token, SapResultCode::GENERIC_FAILURE, + atr); + break; } case MsgId_RIL_SIM_SAP_POWER: - sapCallback->powerResponse(token, SapResultCode::GENERIC_FAILURE); - return; + retStatus = sapCallback->powerResponse(token, SapResultCode::GENERIC_FAILURE); + break; case MsgId_RIL_SIM_SAP_RESET_SIM: - sapCallback->resetSimResponse(token, SapResultCode::GENERIC_FAILURE); - return; + retStatus = sapCallback->resetSimResponse(token, SapResultCode::GENERIC_FAILURE); + break; case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS: - sapCallback->transferCardReaderStatusResponse(token, SapResultCode::GENERIC_FAILURE, 0); - return; + retStatus = sapCallback->transferCardReaderStatusResponse(token, + SapResultCode::GENERIC_FAILURE, 0); + break; case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL: - sapCallback->transferProtocolResponse(token, SapResultCode::NOT_SUPPORTED); - return; + retStatus = sapCallback->transferProtocolResponse(token, SapResultCode::NOT_SUPPORTED); + break; + default: return; } + sapService[slotId]->checkReturnStatus(retStatus); } Return SapImpl::connectReq(int32_t token, int32_t maxMsgSize) { @@ -313,8 +330,8 @@ Return SapImpl::transferAtrReq(int32_t token) { size_t encodedSize = 0; if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_TRANSFER_ATR_REQ_fields, &req)) { - RLOGE("SapImpl::transferAtrReq: Error getting encoded size for \ - RIL_SIM_SAP_TRANSFER_ATR_REQ"); + RLOGE("SapImpl::transferAtrReq: Error getting encoded size for " + "RIL_SIM_SAP_TRANSFER_ATR_REQ"); sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 1, msg); return Status::fromStatusT(android::NO_MEMORY); } @@ -439,8 +456,8 @@ Return SapImpl::transferCardReaderStatusReq(int32_t token) { size_t encodedSize = 0; if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ_fields, &req)) { - RLOGE("SapImpl::transferCardReaderStatusReq: Error getting encoded size for \ - RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ"); + RLOGE("SapImpl::transferCardReaderStatusReq: Error getting encoded size for " + "RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ"); sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 1, msg); return Status::fromStatusT(android::NO_MEMORY); } @@ -483,8 +500,8 @@ Return SapImpl::setTransferProtocolReq(int32_t token, SapTransferProtocol size_t encodedSize = 0; if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ_fields, &req)) { - RLOGE("SapImpl::setTransferProtocolReq: Error getting encoded size for \ - RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ"); + RLOGE("SapImpl::setTransferProtocolReq: Error getting encoded size for " + "RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ"); sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 1, msg); return Status::fromStatusT(android::NO_MEMORY); } @@ -760,6 +777,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { RLOGD("processResponse: sapCallback != NULL; msgId = %d; msgType = %d", msgId, msgType); + Return retStatus; switch (msgId) { case MsgId_RIL_SIM_SAP_CONNECT: { RIL_SIM_SAP_CONNECT_RSP *connectRsp = (RIL_SIM_SAP_CONNECT_RSP *)messagePtr; @@ -767,7 +785,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { rsp->token, connectRsp->response, connectRsp->max_message_size); - sapImpl->sapCallback->connectResponse(rsp->token, + retStatus = sapImpl->sapCallback->connectResponse(rsp->token, (SapConnectRsp)connectRsp->response, connectRsp->max_message_size); break; @@ -776,13 +794,13 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { case MsgId_RIL_SIM_SAP_DISCONNECT: if (msgType == MsgType_RESPONSE) { RLOGD("processResponse: calling sapCallback->disconnectResponse %d", rsp->token); - sapImpl->sapCallback->disconnectResponse(rsp->token); + retStatus = sapImpl->sapCallback->disconnectResponse(rsp->token); } else { RIL_SIM_SAP_DISCONNECT_IND *disconnectInd = (RIL_SIM_SAP_DISCONNECT_IND *)messagePtr; RLOGD("processResponse: calling sapCallback->disconnectIndication %d %d", rsp->token, disconnectInd->disconnectType); - sapImpl->sapCallback->disconnectIndication(rsp->token, + retStatus = sapImpl->sapCallback->disconnectIndication(rsp->token, (SapDisconnectType)disconnectInd->disconnectType); } break; @@ -796,7 +814,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { if (apduRsp->apduResponse != NULL && apduRsp->apduResponse->size > 0) { apduRspVec.setToExternal(apduRsp->apduResponse->bytes, apduRsp->apduResponse->size); } - sapImpl->sapCallback->apduResponse(rsp->token, apduResponse, apduRspVec); + retStatus = sapImpl->sapCallback->apduResponse(rsp->token, apduResponse, apduRspVec); break; } @@ -812,7 +830,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { transferAtrRspVec.setToExternal(transferAtrRsp->atr->bytes, transferAtrRsp->atr->size); } - sapImpl->sapCallback->transferAtrResponse(rsp->token, transferAtrResponse, + retStatus = sapImpl->sapCallback->transferAtrResponse(rsp->token, transferAtrResponse, transferAtrRspVec); break; } @@ -822,7 +840,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { ((RIL_SIM_SAP_POWER_RSP *)messagePtr)->response); RLOGD("processResponse: calling sapCallback->powerResponse %d %d", rsp->token, powerResponse); - sapImpl->sapCallback->powerResponse(rsp->token, powerResponse); + retStatus = sapImpl->sapCallback->powerResponse(rsp->token, powerResponse); break; } @@ -831,7 +849,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { ((RIL_SIM_SAP_RESET_SIM_RSP *)messagePtr)->response); RLOGD("processResponse: calling sapCallback->resetSimResponse %d %d", rsp->token, resetSimResponse); - sapImpl->sapCallback->resetSimResponse(rsp->token, resetSimResponse); + retStatus = sapImpl->sapCallback->resetSimResponse(rsp->token, resetSimResponse); break; } @@ -839,7 +857,8 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { RIL_SIM_SAP_STATUS_IND *statusInd = (RIL_SIM_SAP_STATUS_IND *)messagePtr; RLOGD("processResponse: calling sapCallback->statusIndication %d %d", rsp->token, statusInd->statusChange); - sapImpl->sapCallback->statusIndication(rsp->token, (SapStatus)statusInd->statusChange); + retStatus = sapImpl->sapCallback->statusIndication(rsp->token, + (SapStatus)statusInd->statusChange); break; } @@ -853,7 +872,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { rsp->token, transferCardReaderStatusResponse, transferStatusRsp->CardReaderStatus); - sapImpl->sapCallback->transferCardReaderStatusResponse(rsp->token, + retStatus = sapImpl->sapCallback->transferCardReaderStatusResponse(rsp->token, transferCardReaderStatusResponse, transferStatusRsp->CardReaderStatus); break; @@ -861,7 +880,7 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { case MsgId_RIL_SIM_SAP_ERROR_RESP: { RLOGD("processResponse: calling sapCallback->errorResponse %d", rsp->token); - sapImpl->sapCallback->errorResponse(rsp->token); + retStatus = sapImpl->sapCallback->errorResponse(rsp->token); break; } @@ -875,13 +894,15 @@ void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) { } RLOGD("processResponse: calling sapCallback->transferProtocolResponse %d %d", rsp->token, setTransferProtocolResponse); - sapImpl->sapCallback->transferProtocolResponse(rsp->token, setTransferProtocolResponse); + retStatus = sapImpl->sapCallback->transferProtocolResponse(rsp->token, + setTransferProtocolResponse); break; } default: - break; + return; } + sapImpl->checkReturnStatus(retStatus); } void sap::processResponse(MsgHeader *rsp, RilSapSocket *sapSocket) { -- 2.11.0