From a0c7d4db487af8b8a3e13de8c5dc39ea289d18ff Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Sat, 30 Mar 2013 23:30:47 +0100 Subject: pwr: Refactor code, check for NULL pointers and prevent memory leaks Signed-off-by: Paul Kocialkowski --- pwr.c | 45 ++++++++++++++++++++------------------------- samsung-ril.h | 2 +- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/pwr.c b/pwr.c index 35f9b43..6efc4d8 100644 --- a/pwr.c +++ b/pwr.c @@ -26,10 +26,11 @@ #include "util.h" /* - * Out: RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED - * Modem lets us know it's powered on. Though, it's still in LPM and should - * be considered as OFF. Send this to update RILJ radio state (OFF) + * Modem lets us know it's powered on. Though, it's still in LPM and should + * be considered as OFF. This request is used as a first indication that + * we can communicate with the modem, so unlock RIL start from here. */ + void ipc_pwr_phone_pwr_up(void) { ril_data.state.radio_state = RADIO_STATE_OFF; @@ -44,20 +45,16 @@ void ipc_pwr_phone_reset(void) ril_request_unsolicited(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, NULL, 0); } -/* - * In: IPC_PWR_PHONE_STATE - * Noti from the modem giving current power mode (LPM or NORMAL) - * LPM = Low Power Mode (airplane mode for instance) - * - * Out: RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED - * Update radio state according to modem power state - */ void ipc_pwr_phone_state(struct ipc_message_info *info) { - uint8_t state = *((uint8_t *) info->data); + unsigned char state; + + if (info == NULL || info->data == NULL || info->length < sizeof(unsigned char)) + return; + + state = *((unsigned char *) info->data); - switch(state) - { + switch (state) { case IPC_PWR_R(IPC_PWR_PHONE_STATE_LPM): LOGD("Got power to LPM"); @@ -69,7 +66,7 @@ void ipc_pwr_phone_state(struct ipc_message_info *info) ril_data.state.radio_state = RADIO_STATE_OFF; ril_data.state.power_state = IPC_PWR_PHONE_STATE_LPM; ril_request_unsolicited(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, NULL, 0); - break; + break; case IPC_PWR_R(IPC_PWR_PHONE_STATE_NORMAL): LOGD("Got power to NORMAL"); @@ -81,24 +78,22 @@ void ipc_pwr_phone_state(struct ipc_message_info *info) ril_data.state.radio_state = RADIO_STATE_SIM_NOT_READY; ril_data.state.power_state = IPC_PWR_PHONE_STATE_NORMAL; ril_request_unsolicited(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, NULL, 0); - break; + break; } ril_tokens_check(); } -/* - * In: RIL_REQUEST_RADIO_POWER - * Request ON or OFF radio power mode - * - * Out: IPC_PWR_PHONE_STATE - * Order the modem to get in required power mode - */ -void ril_request_radio_power(RIL_Token t, void *data, size_t datalen) +void ril_request_radio_power(RIL_Token t, void *data, int length) { - int power_state = *((int *)data); + int power_state; unsigned short power_data; + if (data == NULL || length < (int) sizeof(int)) + return; + + power_state = *((int *) data); + LOGD("requested power_state is %d", power_state); if (power_state > 0) { diff --git a/samsung-ril.h b/samsung-ril.h index c6c1a7e..1346cdf 100644 --- a/samsung-ril.h +++ b/samsung-ril.h @@ -241,7 +241,7 @@ void ipc_gen_phone_res(struct ipc_message_info *info); void ipc_pwr_phone_pwr_up(void); void ipc_pwr_phone_reset(void); void ipc_pwr_phone_state(struct ipc_message_info *info); -void ril_request_radio_power(RIL_Token t, void *data, size_t datalen); +void ril_request_radio_power(RIL_Token t, void *data, int length); /* DISP */ -- cgit v1.1