Merge commit 'c863521147c0fdf8497a10430f85c306e60f2084' into remote
Conflicts:
include/telephony/ril.h
libril/ril.cpp
libril/ril_commands.h
libril/ril_unsol_commands.h
Change-Id: Ic2086de853e7425dcedf5db69341e8b51509a2bf
diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 5fcd901..b989636 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -344,7 +344,17 @@
PREF_NET_TYPE_LTE_GSM_WCDMA = 9, /* LTE, GSM/WCDMA */
PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA = 10, /* LTE, CDMA, EvDo, GSM/WCDMA */
PREF_NET_TYPE_LTE_ONLY = 11, /* LTE only */
- PREF_NET_TYPE_LTE_WCDMA = 12 /* LTE/WCDMA */
+ PREF_NET_TYPE_LTE_WCDMA = 12, /* LTE/WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_ONLY = 13, /* TD-SCDMA only */
+ PREF_NET_TYPE_TD_SCDMA_WCDMA = 14, /* TD-SCDMA and WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_LTE = 15, /* TD-SCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM = 16, /* TD-SCDMA and GSM */
+ PREF_NET_TYPE_TD_SCDMA_GSM_LTE = 17, /* TD-SCDMA,GSM and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA = 18, /* TD-SCDMA, GSM/WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE = 19, /* TD-SCDMA, WCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE = 20, /* TD-SCDMA, GSM/WCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO = 21, /* TD-SCDMA, GSM/WCDMA, CDMA and EvDo */
+ PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = 22 /* TD-SCDMA, LTE, CDMA, EvDo GSM/WCDMA */
} RIL_PreferredNetworkType;
/* Source for cdma subscription */
@@ -1738,6 +1748,31 @@
uint32_t rx_mode_time_ms;
} RIL_ActivityStatsInfo;
+typedef struct {
+ uint8_t p2; /* P2 parameter */
+ char * aidPtr; /* AID value, See ETSI 102.221 and 101.220*/
+
+} RIL_CafOpenChannelParams;
+
+#define RIL_NUM_ADN_RECORDS 10
+#define RIL_MAX_NUM_AD_COUNT 4
+#define RIL_MAX_NUM_EMAIL_COUNT 2
+
+typedef struct {
+ int record_id;
+ char* name;
+ char* number;
+ int email_elements;
+ char* email[RIL_MAX_NUM_EMAIL_COUNT];
+ int anr_elements;
+ char* ad_number[RIL_MAX_NUM_AD_COUNT];
+} RIL_AdnRecordInfo;
+
+typedef struct {
+ int record_elements;
+ RIL_AdnRecordInfo adn_record_info[RIL_NUM_ADN_RECORDS];
+} RIL_AdnRecord_v1;
+
/**
* RIL_REQUEST_GET_SIM_STATUS
*
@@ -4614,7 +4649,7 @@
* RIL_REQUEST_VOICE_RADIO_TECH
*
* Query the radio technology type (3GPP/3GPP2) used for voice. Query is valid only
- * when radio state is RADIO_STATE_ON
+ * when radio state is not RADIO_STATE_UNAVAILABLE
*
* "data" is NULL
* "response" is int *
@@ -5179,6 +5214,81 @@
* RIL_E_REQUEST_NOT_SUPPORTED
*/
#define RIL_REQUEST_GET_CARRIER_RESTRICTIONS 137
+/**
+ * RIL_REQUEST_SIM_GET_ATR
+ *
+ * Get the ATR from SIM Card
+ *
+ * Only valid when radio state is "RADIO_STATE_ON"
+ *
+ * "data" is const int *
+ * ((const int *)data)[0] contains the slot index on the SIM from which ATR is requested.
+ *
+ * "response" is a const char * containing the ATR, See ETSI 102.221 8.1 and ISO/IEC 7816 3
+ *
+ * Valid errors:
+ *
+ * SUCCESS
+ * RADIO_NOT_AVAILABLE (radio resetting)
+ * GENERIC_FAILURE
+ */
+#define RIL_REQUEST_SIM_GET_ATR 138
+
+/**
+ * RIL_REQUEST_CAF_SIM_OPEN_CHANNEL_WITH_P2
+ *
+ * Open a new logical channel and select the given application. This command
+ * reflects TS 27.007 "open logical channel" operation (+CCHO). This request
+ * also specifies the P2 parameter.
+ *
+ * "data" is a const RIL_CafOpenChannelParam *
+ *
+ * "response" is int *
+ * ((int *)data)[0] contains the session id of the logical channel.
+ * ((int *)data)[1] onwards may optionally contain the select response for the
+ * open channel command with one byte per integer.
+ *
+ * Valid errors:
+ * SUCCESS
+ * RADIO_NOT_AVAILABLE
+ * GENERIC_FAILURE
+ * MISSING_RESOURCE
+ * NO_SUCH_ELEMENT
+ */
+#define RIL_REQUEST_CAF_SIM_OPEN_CHANNEL_WITH_P2 139
+
+/**
+ * RIL_REQUEST_GET_ADN_RECORD
+ *
+ * Requests ADN count record of the SIM card
+ *
+ * "data" is NULL
+ *
+ * "response" is const int *
+ * ((int *)data)[0] is the max adn count.
+ * ((int *)data)[1] is the valid adn count.
+ * ((int *)data)[2] is the max email count.
+ * ((int *)data)[3] is the max anr count.
+ *
+ * Valid errors:
+ * SUCCESS
+ * GENERIC_FAILURE
+ */
+#define RIL_REQUEST_GET_ADN_RECORD 140
+
+/**
+ * RIL_REQUEST_UPDATE_ADN_RECORD
+ *
+ * Requests ADN count of the the SIM card
+ *
+ * "data" is RIL_AdnRecordInfo *
+ *
+ * "response" is const int *
+ *
+ * Valid errors:
+ * Must never fail
+ */
+#define RIL_REQUEST_UPDATE_ADN_RECORD 141
/***********************************************************************/
@@ -5807,6 +5917,25 @@
*
*/
#define RIL_UNSOL_PCO_DATA 1046
+/**
+ * RIL_UNSOL_RESPONSE_ADN_INIT_DONE
+ *
+ * Called when the ADN has already init done,
+ *
+ * "data" is NULL.
+ *
+ */
+#define RIL_UNSOL_RESPONSE_ADN_INIT_DONE 1047
+
+/**
+ * RIL_UNSOL_RESPONSE_ADN_RECORDS
+ *
+ * Called when there is a group of ADN record report,
+ *
+ * "data" is the RIL_ADN structure.
+ *
+ */
+#define RIL_UNSOL_RESPONSE_ADN_RECORDS 1048
/***********************************************************************/
diff --git a/libril/RilSapSocket.cpp b/libril/RilSapSocket.cpp
index 33eabb5..13d6f65 100644
--- a/libril/RilSapSocket.cpp
+++ b/libril/RilSapSocket.cpp
@@ -86,7 +86,9 @@
const void *data,
size_t datalen) {
RilSapSocket *sap_socket = getSocketById(RIL_SOCKET_1);
- sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
+ if(sap_socket){
+ sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
+ }
}
#endif
@@ -249,7 +251,7 @@
int per_line = 0;
do {
- dest += sprintf(out, "%8.8s [%8.8x] ", who, source);
+ dest += snprintf(out, sizeof(out), "%8.8s [%8.8x] ", who, source);
for(; source < length && dest_len - dest > 3 && per_line < BYTES_PER_LINE; source++,
per_line ++) {
out[dest++] = HEX_HIGH(buffer[source]);
diff --git a/libril/ril.cpp b/libril/ril.cpp
index d7744c0..27ab3b8 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -283,6 +283,8 @@
static void dispatchDataProfile(Parcel &p, RequestInfo *pRI);
static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI);
static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI);
+static void dispatchOpenChannelWithP2(Parcel &p, RequestInfo *pRI);
+static void dispatchAdnRecord(Parcel &p, RequestInfo *pRI);
static int responseInts(Parcel &p, void *response, size_t responselen);
static int responseFailCause(Parcel &p, void *response, size_t responselen);
static int responseStrings(Parcel &p, void *response, size_t responselen);
@@ -317,6 +319,7 @@
static int responseActivityData(Parcel &p, void *response, size_t responselen);
static int responseCarrierRestrictions(Parcel &p, void *response, size_t responselen);
static int responsePcoData(Parcel &p, void *response, size_t responselen);
+static int responseAdnRecords(Parcel &p, void *response, size_t responselen);
static int decodeVoiceRadioTechnology (RIL_RadioState radioState);
static int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
@@ -1721,12 +1724,12 @@
static void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
- if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
+ if (RADIO_STATE_UNAVAILABLE == state) {
RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
}
- // RILs that support RADIO_STATE_ON should support this request.
- if (RADIO_STATE_ON == state) {
+ // If radio is available then RIL should support this request.
+ if ((RADIO_STATE_ON == state) || (RADIO_STATE_OFF == state)){
dispatchVoid(p, pRI);
return;
}
@@ -2237,6 +2240,143 @@
return;
}
+/**
+ * Callee expects const RIL_CafOpenChannelParams *
+ * Payload is:
+ * byte p2
+ * char * aidPtr
+ */
+static void dispatchOpenChannelWithP2 (Parcel &p, RequestInfo *pRI) {
+ RIL_CafOpenChannelParams openChannel;
+ status_t status;
+ uint8_t p2;
+
+#if VDBG
+ RLOGD("dispatchOpenChannelWithP2");
+#endif
+ memset (&openChannel, 0, sizeof(RIL_CafOpenChannelParams));
+
+ status = p.read(&p2, sizeof(p2));
+ openChannel.p2 = (uint8_t) p2;
+
+ openChannel.aidPtr = strdupReadString(p);
+ if (status != NO_ERROR || openChannel.aidPtr == NULL) {
+ goto invalid;
+ }
+
+ startRequest;
+ appendPrintBuf("%s[p2:%d, aid:%s]", printBuf, openChannel.p2, openChannel.aidPtr);
+
+ closeRequest;
+ printRequest(pRI->token, pRI->pCI->requestNumber);
+
+ CALL_ONREQUEST(pRI->pCI->requestNumber,
+ &openChannel,
+ sizeof(openChannel),
+ pRI, pRI->socket_id);
+
+#ifdef MEMSET_FREED
+ memsetString(openChannel.aidPtr);
+#endif
+
+ free(openChannel.aidPtr);
+
+#ifdef MEMSET_FREED
+ memset(&openChannel, 0, sizeof(openChannel));
+#endif
+
+ return;
+invalid:
+ invalidCommandBlock(pRI);
+ return;
+}
+
+static void dispatchAdnRecord(Parcel &p, RequestInfo *pRI) {
+ int32_t t;
+ status_t status;
+ RIL_AdnRecordInfo adnInfo;
+
+ status = p.readInt32(&t);
+ adnInfo.record_id = (int) t;
+
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+
+ adnInfo.name = strdupReadString(p);
+ adnInfo.number = strdupReadString(p);
+
+ startRequest;
+ appendPrintBuf("%srecordIndex=%d, name=%s, number=%s, ", printBuf,
+ (int)adnInfo.record_id, adnInfo.name, adnInfo.number);
+
+ status = p.readInt32(&t);
+ adnInfo.email_elements= (int) t;
+
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+
+ appendPrintBuf("%semailElements=%d, ", printBuf, adnInfo.email_elements);
+
+ for (int i = 0 ; i < adnInfo.email_elements ; i++) {
+ adnInfo.email[i] = strdupReadString(p);
+ appendPrintBuf("%snvwi.itemID=%d, email=%s, ", printBuf, i, adnInfo.email[i]);
+ }
+
+ status = p.readInt32(&t);
+ adnInfo.anr_elements= (int) t;
+
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+
+ appendPrintBuf("%sanrElements=%d, ", printBuf, adnInfo.anr_elements);
+
+ for (int i = 0 ; i < adnInfo.anr_elements ; i++) {
+ adnInfo.ad_number[i] = strdupReadString(p);
+ appendPrintBuf("%snvwi.itemID=%d, anr=%s, ", printBuf, i, adnInfo.ad_number[i]);
+ }
+
+ closeRequest;
+
+ printRequest(pRI->token, pRI->pCI->requestNumber);
+
+ CALL_ONREQUEST(pRI->pCI->requestNumber, &adnInfo, sizeof(adnInfo), pRI, pRI->socket_id);
+
+#ifdef MEMSET_FREED
+ memsetString(adnInfo.name);
+ memsetString(adnInfo.number);
+#endif
+
+ free(adnInfo.name);
+ free(adnInfo.number);
+
+ for (int i = 0 ; i < adnInfo.email_elements ; i++) {
+#ifdef MEMSET_FREED
+ memsetString (adnInfo.email[i]);
+#endif
+ free(adnInfo.email[i]);
+ }
+
+ for (int i = 0 ; i < adnInfo.anr_elements ; i++) {
+#ifdef MEMSET_FREED
+ memsetString (adnInfo.ad_number[i]);
+#endif
+ free(adnInfo.ad_number[i]);
+ }
+
+#ifdef MEMSET_FREED
+ memset(&adnInfo, 0, sizeof(adnInfo));
+#endif
+
+ return;
+
+invalid:
+ invalidCommandBlock(pRI);
+ return;
+}
+
static int
blockingWrite(int fd, const void *buffer, size_t len) {
size_t writeOffset = 0;
@@ -2974,7 +3114,6 @@
infoRec = &p_cur->infoRec[i];
p.writeInt32(infoRec->name);
switch (infoRec->name) {
- case RIL_CDMA_DISPLAY_INFO_REC:
case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
if (infoRec->rec.display.alpha_len >
CDMA_ALPHA_INFO_BUFFER_LENGTH) {
@@ -2984,6 +3123,20 @@
CDMA_ALPHA_INFO_BUFFER_LENGTH);
return RIL_ERRNO_INVALID_RESPONSE;
}
+ // Write as a byteArray
+ p.writeInt32(infoRec->rec.display.alpha_len);
+ p.write(infoRec->rec.display.alpha_buf,
+ infoRec->rec.display.alpha_len);
+ break;
+ case RIL_CDMA_DISPLAY_INFO_REC:
+ if (infoRec->rec.display.alpha_len >
+ CDMA_ALPHA_INFO_BUFFER_LENGTH) {
+ RLOGE("invalid display info response length %d \
+ expected not more than %d\n",
+ (int)infoRec->rec.display.alpha_len,
+ CDMA_ALPHA_INFO_BUFFER_LENGTH);
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
string8 = (char*) calloc(infoRec->rec.display.alpha_len + 1, sizeof(char));
if (string8 == NULL) {
RLOGE("Memory allocation failed for responseCdmaInformationRecords");
@@ -4135,6 +4288,55 @@
return 0;
}
+static void sendAdnRecordInfo(Parcel &p, int num_records, RIL_AdnRecordInfo recordInfo[]) {
+ startResponse;
+ for (int i = 0; i < num_records; i++) {
+ p.writeInt32(recordInfo[i].record_id);
+ writeStringToParcel(p, (const char*)(recordInfo[i].name));
+ writeStringToParcel(p, (const char*)(recordInfo[i].number));
+
+ p.writeInt32(recordInfo[i].email_elements);
+ for (int j = 0; j < recordInfo[i].email_elements; j++) {
+ writeStringToParcel(p, (const char*)(recordInfo[i].email[j]));
+ }
+ p.writeInt32(recordInfo[i].anr_elements);
+ for (int j = 0; j < recordInfo[i].anr_elements; j++) {
+ writeStringToParcel(p, (const char*)(recordInfo[i].ad_number[j]));
+ }
+
+ appendPrintBuf("%s[record_id=%d,number=%s,anr_elements=%d,email_elements=%d],",
+ printBuf,
+ recordInfo[i].record_id,
+ recordInfo[i].name,
+ recordInfo[i].number,
+ recordInfo[i].email_elements,
+ recordInfo[i].anr_elements);
+ }
+ closeResponse;
+}
+
+static int responseAdnRecords(Parcel &p, void *response, size_t responselen) {
+ int i;
+
+ if (response == NULL && responselen != 0) {
+ RLOGE("invalid response: NULL");
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ if (responselen == sizeof (RIL_AdnRecord_v1)) {
+ RIL_AdnRecord_v1 *p_cur = ((RIL_AdnRecord_v1 *) response);
+
+ p.writeInt32(p_cur->record_elements);
+
+ sendAdnRecordInfo(p, p_cur->record_elements, p_cur->adn_record_info);
+ } else {
+ RLOGE("responseAdnRecords: A RIL_AdnRecord_v1 expected\n");
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ return 0;
+}
+
/**
* A write on the wakeup fd is done just to pop us out of select()
* We empty the buffer here and then ril_event will reset the timers on the
@@ -5758,10 +5960,12 @@
case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
+ case RIL_REQUEST_CAF_SIM_OPEN_CHANNEL_WITH_P2: return "CAF_SIM_OPEN_CHANNEL_WITH_P2";
case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
+ case RIL_REQUEST_SIM_GET_ATR: return "SIM_GET_ATR";
case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
@@ -5771,6 +5975,8 @@
case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
case RIL_REQUEST_SET_CARRIER_RESTRICTIONS: return "SET_CARRIER_RESTRICTIONS";
case RIL_REQUEST_GET_CARRIER_RESTRICTIONS: return "GET_CARRIER_RESTRICTIONS";
+ case RIL_REQUEST_GET_ADN_RECORD: return "RIL_REQUEST_GET_ADN_RECORD";
+ case RIL_REQUEST_UPDATE_ADN_RECORD: return "RIL_REQUEST_UPDATE_ADN_RECORD";
case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
@@ -5817,6 +6023,8 @@
case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
case RIL_RESPONSE_ACKNOWLEDGEMENT: return "RIL_RESPONSE_ACKNOWLEDGEMENT";
case RIL_UNSOL_PCO_DATA: return "RIL_UNSOL_PCO_DATA";
+ case RIL_UNSOL_RESPONSE_ADN_INIT_DONE: return "RIL_UNSOL_RESPONSE_ADN_INIT_DONE";
+ case RIL_UNSOL_RESPONSE_ADN_RECORDS: return "RIL_UNSOL_RESPONSE_ADN_RECORDS";
default: return "<unknown request>";
}
}
diff --git a/libril/ril_commands.h b/libril/ril_commands.h
index 8d02c39..67a1d59 100644
--- a/libril/ril_commands.h
+++ b/libril/ril_commands.h
@@ -152,3 +152,7 @@
{RIL_REQUEST_GET_ACTIVITY_INFO, dispatchVoid, responseActivityData},
{RIL_REQUEST_SET_CARRIER_RESTRICTIONS, dispatchCarrierRestrictions, responseInts},
{RIL_REQUEST_GET_CARRIER_RESTRICTIONS, dispatchVoid, responseCarrierRestrictions},
+ {RIL_REQUEST_SIM_GET_ATR, dispatchInts, responseString},
+ {RIL_REQUEST_CAF_SIM_OPEN_CHANNEL_WITH_P2, dispatchOpenChannelWithP2, responseInts},
+ {RIL_REQUEST_GET_ADN_RECORD, dispatchVoid, responseInts},
+ {RIL_REQUEST_UPDATE_ADN_RECORD, dispatchAdnRecord, responseInts},
diff --git a/libril/ril_unsol_commands.h b/libril/ril_unsol_commands.h
old mode 100755
new mode 100644
index 11ae050..0114639
--- a/libril/ril_unsol_commands.h
+++ b/libril/ril_unsol_commands.h
@@ -61,3 +61,5 @@
{RIL_UNSOL_STK_CC_ALPHA_NOTIFY, responseString, WAKE_PARTIAL},
{RIL_UNSOL_LCEDATA_RECV, responseLceData, WAKE_PARTIAL},
{RIL_UNSOL_PCO_DATA, responsePcoData, WAKE_PARTIAL},
+ {RIL_UNSOL_RESPONSE_ADN_INIT_DONE, responseVoid, WAKE_PARTIAL},
+ {RIL_UNSOL_RESPONSE_ADN_RECORDS, responseAdnRecords, WAKE_PARTIAL},
diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c
index 089100f..27329e1 100644
--- a/reference-ril/reference-ril.c
+++ b/reference-ril/reference-ril.c
@@ -532,23 +532,27 @@
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].type = alloca(strlen(out) + 1);
- strcpy(responses[i].type, out);
+
+ int type_size = strlen(out) + 1;
+ responses[i].type = alloca(type_size);
+ strlcpy(responses[i].type, out, type_size);
// APN ignored for v5
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].ifname = alloca(strlen(PPP_TTY_PATH) + 1);
- strcpy(responses[i].ifname, PPP_TTY_PATH);
+ int ifname_size = strlen(PPP_TTY_PATH) + 1;
+ responses[i].ifname = alloca(ifname_size);
+ strlcpy(responses[i].ifname, PPP_TTY_PATH, ifname_size);
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].addresses = alloca(strlen(out) + 1);
- strcpy(responses[i].addresses, out);
+ int addresses_size = strlen(out) + 1;
+ responses[i].addresses = alloca(addresses_size);
+ strlcpy(responses[i].addresses, out, addresses_size);
{
char propValue[PROP_VALUE_MAX];
diff --git a/rild/rild.rc b/rild/rild.rc
index 35b424f..a43d77e 100644
--- a/rild/rild.rc
+++ b/rild/rild.rc
@@ -4,4 +4,4 @@
socket sap_uim_socket1 stream 660 bluetooth bluetooth
socket rild-debug stream 660 radio system
user root
- group radio cache inet misc audio log readproc wakelock
+ group radio cache inet misc audio log readproc wakelock qcom_diag