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
diff --git a/ril/libril/ril_service.cpp b/ril/libril/ril_service.cpp
index 76670df..f2b7714 100644
--- a/ril/libril/ril_service.cpp
+++ b/ril/libril/ril_service.cpp
@@ -486,9 +486,9 @@
* 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;
}
@@ -502,6 +502,10 @@
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) {
@@ -537,7 +541,7 @@
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;
@@ -554,7 +558,7 @@
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]);
@@ -798,7 +802,7 @@
#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();
}
@@ -808,7 +812,7 @@
#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();
}
@@ -818,7 +822,7 @@
#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();
}
@@ -828,7 +832,7 @@
#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();
}
@@ -838,7 +842,7 @@
#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();
}
@@ -848,7 +852,7 @@
#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();
}
@@ -858,7 +862,7 @@
#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();
}
@@ -917,7 +921,7 @@
#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();
}
@@ -1028,7 +1032,7 @@
#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();
}
@@ -1037,7 +1041,7 @@
#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();
}
@@ -1071,7 +1075,7 @@
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(),
@@ -1089,7 +1093,7 @@
}
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(),
@@ -1248,7 +1252,7 @@
#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();
}
@@ -1259,7 +1263,7 @@
#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();
@@ -1271,7 +1275,7 @@
#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();
@@ -1283,7 +1287,7 @@
#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();
}
@@ -1587,7 +1591,7 @@
#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();
@@ -1856,7 +1860,7 @@
#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();
}
@@ -1908,19 +1912,8 @@
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 =
@@ -1962,19 +1955,8 @@
} 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)) {
@@ -2394,20 +2376,21 @@
for (size_t i = 0; i < num; i++) {
dataProfilePtrs[i] = &dataProfiles[i];
- success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
+ success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
const hidl_string &protocol =
(isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
- if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
+ if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
success = false;
}
- if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
+ if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
+ true)) {
success = false;
}
if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
- pRI)) {
+ pRI, true)) {
success = false;
}
@@ -2457,25 +2440,26 @@
for (size_t i = 0; i < num; i++) {
dataProfilePtrs[i] = &dataProfiles[i];
- success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
+ success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
pRI)) {
success = false;
}
if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
- profiles[i].roamingProtocol, pRI)) {
+ profiles[i].roamingProtocol, pRI, true)) {
success = false;
}
- if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
+ if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
+ true)) {
success = false;
}
if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
- pRI)) {
+ pRI, true)) {
success = false;
}
if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
- profiles[i].mvnoMatchData, pRI)) {
+ profiles[i].mvnoMatchData, pRI, true)) {
success = false;
}