From 7c37381c93c54cf4ce64e345a87b5fa0c28bb077 Mon Sep 17 00:00:00 2001 From: Ruthwar Kumar Ambeer Date: Thu, 23 Mar 2017 17:38:56 +0530 Subject: [PATCH] Sending empty strings instead of NULL for some RIL requests Some vendor RILs expect empty string instead of NULL pointer for certain RIL requets. For RIL_REQUEST_ENTER_SIM_PIN, RIL_REQUEST_ENTER_SIM_PUK, RIL_REQUEST_ENTER_SIM_PIN2, RIL_REQUEST_ENTER_SIM_PUK2, RIL_REQUEST_CHANGE_SIM_PIN, RIL_REQUEST_CHANGE_SIM_PIN2, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION RIL_REQUEST_SETUP_DATA_CALL, RIL_REQUEST_SET_INITIAL_ATTACH_APN, RIL_REQUEST_SET_DATA_PROFILE, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, RIL_REQUEST_SET_FACILITY_LOCK, RIL_REQUEST_CHANGE_BARRING_PASSWORD, sending empty string instead of NULL. Test: Manual Bug: 37782683, 65653485 Change-Id: I6627c8a12e096b9ac8ebe08e734782cfa951c488 --- libril/ril_service.cpp | 98 +++++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 57 deletions(-) diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index d4fbdc7..5cb65d1 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -496,9 +496,9 @@ void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) { * request with error RIL_E_NO_MEMORY. * Returns true on success, and false on failure. */ -bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) { +bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) { size_t len = src.size(); - if (len == 0) { + if (len == 0 && !allowEmpty) { *dest = NULL; return true; } @@ -512,6 +512,10 @@ bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) return true; } +bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) { + return copyHidlStringToRil(dest, src, pRI, false); +} + hidl_string convertCharPtrToHidlString(const char *ptr) { hidl_string ret; if (ptr != NULL) { @@ -547,7 +551,7 @@ bool dispatchString(int serial, int slotId, int request, const char * str) { return true; } -bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) { +bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) { RequestInfo *pRI = android::addRequestToList(serial, slotId, request); if (pRI == NULL) { return false; @@ -564,7 +568,7 @@ bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) va_start(ap, countStrings); for (int i = 0; i < countStrings; i++) { const char* str = va_arg(ap, const char *); - if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) { + if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) { va_end(ap); for (int j = 0; j < i; j++) { memsetAndFreeStrings(1, pStrings[j]); @@ -817,7 +821,7 @@ Return RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pi #if VDBG RLOGD("supplyIccPinForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true, 2, pin.c_str(), aid.c_str()); return Void(); } @@ -827,7 +831,7 @@ Return RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& pu #if VDBG RLOGD("supplyIccPukForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true, 3, puk.c_str(), pin.c_str(), aid.c_str()); return Void(); } @@ -837,7 +841,7 @@ Return RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& p #if VDBG RLOGD("supplyIccPin2ForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true, 2, pin2.c_str(), aid.c_str()); return Void(); } @@ -847,7 +851,7 @@ Return RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& p #if VDBG RLOGD("supplyIccPuk2ForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true, 3, puk2.c_str(), pin2.c_str(), aid.c_str()); return Void(); } @@ -857,7 +861,7 @@ Return RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& ol #if VDBG RLOGD("changeIccPinForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, + dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true, 3, oldPin.c_str(), newPin.c_str(), aid.c_str()); return Void(); } @@ -867,7 +871,7 @@ Return RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& o #if VDBG RLOGD("changeIccPin2ForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, + dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true, 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str()); return Void(); } @@ -877,7 +881,7 @@ Return RadioImpl::supplyNetworkDepersonalization(int32_t serial, #if VDBG RLOGD("supplyNetworkDepersonalization: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true, 1, netPin.c_str()); return Void(); } @@ -936,7 +940,7 @@ Return RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) { #if VDBG RLOGD("getImsiForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, + dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false, 1, aid.c_str()); return Void(); } @@ -1047,7 +1051,7 @@ Return RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) { #if VDBG RLOGD("sendSms: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, + dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false, 2, message.smscPdu.c_str(), message.pdu.c_str()); return Void(); } @@ -1056,7 +1060,7 @@ Return RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& m #if VDBG RLOGD("sendSMSExpectMore: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, + dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false, 2, message.smscPdu.c_str(), message.pdu.c_str()); return Void(); } @@ -1090,7 +1094,7 @@ Return RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechn if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) { const hidl_string &protocol = (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol); - dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7, + dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7, std::to_string((int) radioTechnology + 2).c_str(), std::to_string((int) dataProfileInfo.profileId).c_str(), dataProfileInfo.apn.c_str(), @@ -1108,7 +1112,7 @@ Return RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechn } return Void(); } - dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15, + dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15, std::to_string((int) radioTechnology + 2).c_str(), std::to_string((int) dataProfileInfo.profileId).c_str(), dataProfileInfo.apn.c_str(), @@ -1267,7 +1271,7 @@ Return RadioImpl::deactivateDataCall(int32_t serial, #if VDBG RLOGD("deactivateDataCall: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, + dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false, 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0"); return Void(); } @@ -1278,7 +1282,7 @@ Return RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& #if VDBG RLOGD("getFacilityLockForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, + dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true, 4, facility.c_str(), password.c_str(), (std::to_string(serviceClass)).c_str(), appId.c_str()); return Void(); @@ -1290,7 +1294,7 @@ Return RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& #if VDBG RLOGD("setFacilityLockForApp: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, + dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true, 5, facility.c_str(), lockState ? "1" : "0", password.c_str(), (std::to_string(serviceClass)).c_str(), appId.c_str() ); return Void(); @@ -1302,7 +1306,7 @@ Return RadioImpl::setBarringPassword(int32_t serial, const hidl_string& fa #if VDBG RLOGD("setBarringPassword: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, + dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true, 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str()); return Void(); } @@ -1680,7 +1684,7 @@ Return RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, i #if VDBG RLOGD("sendBurstDtmf: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, + dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false, 3, dtmf.c_str(), (std::to_string(on)).c_str(), (std::to_string(off)).c_str()); return Void(); @@ -1949,7 +1953,7 @@ Return RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool su #if VDBG RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial); #endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, + dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false, 2, success ? "1" : "0", ackPdu.c_str()); return Void(); } @@ -2001,19 +2005,8 @@ Return RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInf if (s_vendorFunctions->version <= 14) { RIL_InitialAttachApn iaa = {}; - if (dataProfileInfo.apn.size() == 0) { - iaa.apn = (char *) calloc(1, sizeof(char)); - if (iaa.apn == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - iaa.apn[0] = '\0'; - } else { - if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) { - return Void(); - } + if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) { + return Void(); } const hidl_string &protocol = @@ -2039,19 +2032,8 @@ Return RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInf } else { RIL_InitialAttachApn_v15 iaa = {}; - if (dataProfileInfo.apn.size() == 0) { - iaa.apn = (char *) calloc(1, sizeof(char)); - if (iaa.apn == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - iaa.apn[0] = '\0'; - } else { - if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) { - return Void(); - } + if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) { + return Void(); } if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) { @@ -2480,20 +2462,21 @@ Return RadioImpl::setDataProfile(int32_t serial, const hidl_vec RadioImpl::setDataProfile(int32_t serial, const hidl_vec