diff options
author | Aki Niemi <aki.niemi@nokia.com> | 2010-10-19 11:28:06 +0300 |
---|---|---|
committer | Aki Niemi <aki.niemi@nokia.com> | 2010-10-19 15:06:35 +0300 |
commit | 255782f8c2ff64991b362fb0e0554bd2adb7069e (patch) | |
tree | 86d891e0259255cc78f6344da69bbb33ad5a7b0c /drivers | |
parent | fd74feac0d7c5bbba4653b0b5c43c458c6874971 (diff) | |
download | ofono-255782f8c2ff64991b362fb0e0554bd2adb7069e.tar.bz2 |
isimodem: Fix request cleanup code
Adds a check for when the driver is being removed, in which case no
new ISI requests should be generated.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isimodem/call-barring.c | 23 | ||||
-rw-r--r-- | drivers/isimodem/call-forwarding.c | 6 | ||||
-rw-r--r-- | drivers/isimodem/call-settings.c | 4 | ||||
-rw-r--r-- | drivers/isimodem/devinfo.c | 6 | ||||
-rw-r--r-- | drivers/isimodem/gprs-context.c | 5 | ||||
-rw-r--r-- | drivers/isimodem/gprs.c | 4 | ||||
-rw-r--r-- | drivers/isimodem/isiutil.h | 1 | ||||
-rw-r--r-- | drivers/isimodem/network-registration.c | 12 | ||||
-rw-r--r-- | drivers/isimodem/phonebook.c | 12 | ||||
-rw-r--r-- | drivers/isimodem/radio-settings.c | 10 | ||||
-rw-r--r-- | drivers/isimodem/sim.c | 11 | ||||
-rw-r--r-- | drivers/isimodem/sms.c | 25 | ||||
-rw-r--r-- | drivers/isimodem/ssn.c | 10 | ||||
-rw-r--r-- | drivers/isimodem/ussd.c | 4 | ||||
-rw-r--r-- | drivers/isimodem/voicecall.c | 10 |
15 files changed, 84 insertions, 59 deletions
diff --git a/drivers/isimodem/call-barring.c b/drivers/isimodem/call-barring.c index 8e067d4d..2a982f9e 100644 --- a/drivers/isimodem/call-barring.c +++ b/drivers/isimodem/call-barring.c @@ -128,10 +128,14 @@ static void isi_set(struct ofono_call_barring *barr, const char *lock, DBG("lock code %s enable %d class %d password %s\n", lock, enable, cls, passwd); - if (cbd && g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, - set_resp_cb, cbd)) + if (!cbd || !bd) + goto error; + + if (g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, + set_resp_cb, cbd)) return; +error: CALLBACK_WITH_FAILURE(cb, data); g_free(cbd); } @@ -271,10 +275,14 @@ static void isi_query(struct ofono_call_barring *barr, const char *lock, DBG("barring query lock code %s\n", lock); - if (cbd && g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, - query_resp_cb, cbd)) + if (!cbd || !bd) + goto error; + + if (g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, + query_resp_cb, cbd)) return; +error: CALLBACK_WITH_FAILURE(cb, 0, data); g_free(cbd); } @@ -338,11 +346,14 @@ static void isi_set_passwd(struct ofono_call_barring *barr, const char *lock, DBG("lock code %s (%u) old password %s new password %s\n", lock, ss_code, old_passwd, new_passwd); - if (cbd && - g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, + if (!cbd || !bd) + goto error; + + if (g_isi_request_make(bd->client, msg, sizeof(msg), SS_TIMEOUT, set_passwd_resp_cb, cbd)) return; +error: CALLBACK_WITH_FAILURE(cb, data); g_free(cbd); } diff --git a/drivers/isimodem/call-forwarding.c b/drivers/isimodem/call-forwarding.c index ce1c9e72..1448451b 100644 --- a/drivers/isimodem/call-forwarding.c +++ b/drivers/isimodem/call-forwarding.c @@ -229,7 +229,7 @@ static void isi_registration(struct ofono_call_forwarding *cf, DBG("forwarding type %d class %d\n", type, cls); - if (!cbd || !number->number || strlen(number->number) > 28) + if (!cbd || !fd || !number->number || strlen(number->number) > 28) goto error; ss_code = forw_type_to_isi_code(type); @@ -349,7 +349,7 @@ static void isi_erasure(struct ofono_call_forwarding *cf, int type, int cls, DBG("forwarding type %d class %d\n", type, cls); - if (!cbd) + if (!cbd || !fd) goto error; ss_code = forw_type_to_isi_code(type); @@ -481,7 +481,7 @@ static void isi_query(struct ofono_call_forwarding *cf, int type, int cls, DBG("forwarding type %d class %d\n", type, cls); - if (!cbd || cls != 7) + if (!cbd || !fd || cls != 7) goto error; ss_code = forw_type_to_isi_code(type); diff --git a/drivers/isimodem/call-settings.c b/drivers/isimodem/call-settings.c index 11a28102..c845d54f 100644 --- a/drivers/isimodem/call-settings.c +++ b/drivers/isimodem/call-settings.c @@ -177,7 +177,7 @@ static void isi_cw_query(struct ofono_call_settings *cs, int cls, DBG("waiting class %d\n", cls); - if (!cbd) + if (!cbd || !sd) goto error; if (g_isi_request_make(sd->client, msg, sizeof(msg), SS_TIMEOUT, @@ -268,7 +268,7 @@ static void isi_cw_set(struct ofono_call_settings *cs, int mode, int cls, DBG("waiting mode %d class %d\n", mode, cls); - if (!cbd) + if (!cbd || !sd) goto error; if (g_isi_request_make(sd->client, msg, sizeof(msg), SS_TIMEOUT, diff --git a/drivers/isimodem/devinfo.c b/drivers/isimodem/devinfo.c index 18df57f4..f7960ff6 100644 --- a/drivers/isimodem/devinfo.c +++ b/drivers/isimodem/devinfo.c @@ -128,7 +128,7 @@ static void isi_query_manufacturer(struct ofono_devinfo *info, INFO_PRODUCT_MANUFACTURER }; - if (!cbd) + if (!cbd || !dev) goto error; if (g_isi_request_make(dev->client, msg, sizeof(msg), @@ -177,7 +177,7 @@ static void isi_query_revision(struct ofono_devinfo *info, 0x00, 0x00, 0x00, 0x00 }; - if (!cbd) + if (!cbd || !dev) goto error; if (g_isi_request_make(dev->client, msg, sizeof(msg), @@ -201,7 +201,7 @@ static void isi_query_serial(struct ofono_devinfo *info, INFO_SN_IMEI_PLAIN }; - if (!cbd) + if (!cbd || !dev) goto error; if (g_isi_request_make(dev->client, msg, sizeof(msg), diff --git a/drivers/isimodem/gprs-context.c b/drivers/isimodem/gprs-context.c index 31f882c6..47e858aa 100644 --- a/drivers/isimodem/gprs-context.c +++ b/drivers/isimodem/gprs-context.c @@ -515,7 +515,7 @@ static void isi_gprs_activate_primary(struct ofono_gprs_context *gc, struct context_data *cd = g_try_new0(struct context_data, 1); struct context_data *old = NULL; - if (!cd) + if (!gcd || !cd) return; cd->cid = ctx->cid; @@ -599,6 +599,9 @@ static void isi_gprs_deactivate_primary(struct ofono_gprs_context *gc, 0x00, /* GPDS context ID, added later */ }; + if (!gcd) + return; + cd = find_context_by_cid(gcd->contexts, cid); if (!cd) { DBG("unknown context: %u", cid); diff --git a/drivers/isimodem/gprs.c b/drivers/isimodem/gprs.c index 6663bd28..9cbe4f3b 100644 --- a/drivers/isimodem/gprs.c +++ b/drivers/isimodem/gprs.c @@ -286,7 +286,7 @@ static void isi_gprs_set_attached(struct ofono_gprs *gprs, int attached, GIsiRequest *req; - if (!cbd) + if (!cbd || !gd) goto error; if (attached) @@ -356,7 +356,7 @@ static void isi_gprs_attached_status(struct ofono_gprs *gprs, GPDS_STATUS_REQ, }; - if (!cbd) + if (!cbd || !gd) goto error; if (g_isi_send(gd->client, msg, sizeof(msg), GPDS_TIMEOUT, diff --git a/drivers/isimodem/isiutil.h b/drivers/isimodem/isiutil.h index 73508afa..d5b73cc6 100644 --- a/drivers/isimodem/isiutil.h +++ b/drivers/isimodem/isiutil.h @@ -34,7 +34,6 @@ static inline struct isi_cb_data *isi_cb_data_new(void *user, void *cb, struct isi_cb_data *ret; ret = g_try_new0(struct isi_cb_data, 1); - if (ret) { ret->cb = cb; ret->data = data; diff --git a/drivers/isimodem/network-registration.c b/drivers/isimodem/network-registration.c index ef117f82..2136d45b 100644 --- a/drivers/isimodem/network-registration.c +++ b/drivers/isimodem/network-registration.c @@ -263,7 +263,7 @@ static void isi_registration_status(struct ofono_netreg *netreg, NET_REG_STATUS_GET_REQ }; - if (!cbd) + if (!cbd || !nd) goto error; if (g_isi_request_make(nd->client, msg, sizeof(msg), @@ -368,7 +368,7 @@ static void isi_current_operator(struct ofono_netreg *netreg, 0x00 /* No sub-blocks */ }; - if (!cbd) + if (!cbd || !nd) goto error; if (g_isi_request_make(nd->client, msg, sizeof(msg), @@ -490,7 +490,7 @@ static void isi_list_operators(struct ofono_netreg *netreg, 0x00 }; - if (!cbd) + if (!cbd || !net) goto error; if (g_isi_request_make(net->client, msg, sizeof(msg), @@ -556,7 +556,7 @@ static void isi_register_auto(struct ofono_netreg *netreg, 0x00 /* Index not used */ }; - if (!cbd) + if (!cbd || !net) goto error; if (g_isi_request_make(net->client, msg, sizeof(msg), @@ -629,7 +629,7 @@ static void isi_register_manual(struct ofono_netreg *netreg, 0x00, 0x00 /* Filler */ }; - if (!cbd) + if (!cbd || !nd) goto error; if (g_isi_request_make(nd->client, msg, sizeof(msg), @@ -876,7 +876,7 @@ static void isi_strength(struct ofono_netreg *netreg, NET_CURRENT_CELL_RSSI }; - if (!cbd) + if (!cbd || !nd) goto error; if (g_isi_request_make(nd->client, msg, sizeof(msg), diff --git a/drivers/isimodem/phonebook.c b/drivers/isimodem/phonebook.c index 1041070e..dc832c44 100644 --- a/drivers/isimodem/phonebook.c +++ b/drivers/isimodem/phonebook.c @@ -259,7 +259,7 @@ static void isi_export_entries(struct ofono_phonebook *pb, const char *storage, 0, 0 /* filler */ }; - if (!cbd) + if (!cbd || !pbd) goto error; if (strcmp(storage, "SM")) @@ -335,10 +335,12 @@ static void isi_phonebook_remove(struct ofono_phonebook *pb) { struct pb_data *data = ofono_phonebook_get_data(pb); - if (data) { - g_isi_client_destroy(data->client); - g_free(data); - } + if (!data) + return; + + ofono_phonebook_set_data(pb, NULL); + g_isi_client_destroy(data->client); + g_free(data); } static struct ofono_phonebook_driver driver = { diff --git a/drivers/isimodem/radio-settings.c b/drivers/isimodem/radio-settings.c index 80ef0a22..d2204762 100644 --- a/drivers/isimodem/radio-settings.c +++ b/drivers/isimodem/radio-settings.c @@ -154,7 +154,7 @@ static void isi_query_rat_mode(struct ofono_radio_settings *rs, 0x00 /* subblock count */ }; - if (!cbd) + if (!cbd || !rd) goto error; if (g_isi_request_make(rd->client, msg, sizeof(msg), GSS_TIMEOUT, @@ -221,7 +221,7 @@ static void isi_set_rat_mode(struct ofono_radio_settings *rs, 0x00 /* filler */ }; - if (!cbd) + if (!cbd || !rd) goto error; if (isi_mode == -1) @@ -297,9 +297,11 @@ static void isi_radio_settings_remove(struct ofono_radio_settings *rs) { struct radio_data *rd = ofono_radio_settings_get_data(rs); - if (rd->client) - g_isi_client_destroy(rd->client); + if (!rd) + return; + ofono_radio_settings_set_data(rs, NULL); + g_isi_client_destroy(rd->client); g_free(rd); } diff --git a/drivers/isimodem/sim.c b/drivers/isimodem/sim.c index d978c85d..d03a07e9 100644 --- a/drivers/isimodem/sim.c +++ b/drivers/isimodem/sim.c @@ -156,6 +156,9 @@ static gboolean isi_read_spn(struct ofono_sim *sim, struct isi_cb_data *cbd) 0 }; + if (!sd) + return FALSE; + return g_isi_request_make(sd->client, msg, sizeof(msg), SIM_TIMEOUT, spn_resp_cb, cbd) != NULL; } @@ -197,6 +200,9 @@ static gboolean isi_read_iccid(struct ofono_sim *sim, struct isi_cb_data *cbd) struct sim_data *sd = ofono_sim_get_data(sim); const unsigned char req[] = { SIM_READ_FIELD_REQ, ICC }; + if (!sd) + return FALSE; + return g_isi_request_make(sd->client, req, sizeof(req), SIM_TIMEOUT, read_iccid_resp_cb, cbd) != NULL; } @@ -337,11 +343,10 @@ static void isi_read_imsi(struct ofono_sim *sim, READ_IMSI }; - if (!cbd) + if (!cbd || !sd) goto error; - if (g_isi_request_make(sd->client, msg, sizeof(msg), - SIM_TIMEOUT, + if (g_isi_request_make(sd->client, msg, sizeof(msg), SIM_TIMEOUT, imsi_resp_cb, cbd)) return; diff --git a/drivers/isimodem/sms.c b/drivers/isimodem/sms.c index 7db67da7..49c94d81 100644 --- a/drivers/isimodem/sms.c +++ b/drivers/isimodem/sms.c @@ -111,7 +111,7 @@ static void isi_sca_query(struct ofono_sms *sms, 1, /* Location, default is 1 */ }; - if (!cbd) + if (!cbd || !sd) goto error; if (g_isi_request_make(sd->sim, msg, sizeof(msg), SIM_TIMEOUT, @@ -177,7 +177,7 @@ static void isi_sca_set(struct ofono_sms *sms, { filler, 38 }, }; - if (!cbd) + if (!cbd || !sd) goto error; encode_bcd_number(sca->number, bcd + 2); @@ -313,7 +313,7 @@ static void isi_submit(struct ofono_sms *sms, unsigned char *pdu, { sca, sca_len }, }; - if (!cbd) + if (!cbd || !sd) goto error; if (g_isi_request_vmake(sd->client, iov, use_default ? 2 : 4, SMS_TIMEOUT, @@ -564,17 +564,16 @@ static void isi_sms_remove(struct ofono_sms *sms) if (!data) return; - if (data->client) { - /* Send a promiscuous routing release, so as not to - * hog resources unnecessarily after being removed */ - g_isi_request_make(data->client, msg, sizeof(msg), - SMS_TIMEOUT, NULL, NULL); - g_isi_client_destroy(data->client); - } - - if (data->sim) - g_isi_client_destroy(data->sim); + ofono_sms_set_data(sms, NULL); + /* + * Send a promiscuous routing release, so as not to + * hog resources unnecessarily after being removed + */ + g_isi_request_make(data->client, msg, sizeof(msg), + SMS_TIMEOUT, NULL, NULL); + g_isi_client_destroy(data->client); + g_isi_client_destroy(data->sim); g_free(data); } diff --git a/drivers/isimodem/ssn.c b/drivers/isimodem/ssn.c index e69ea16d..797ba9d2 100644 --- a/drivers/isimodem/ssn.c +++ b/drivers/isimodem/ssn.c @@ -67,10 +67,12 @@ static void isi_ssn_remove(struct ofono_ssn *ssn) { struct ssn_data *data = ofono_ssn_get_data(ssn); - if (data) { - g_isi_client_destroy(data->client); - g_free(data); - } + if (!data) + return; + + ofono_ssn_set_data(ssn, NULL); + g_isi_client_destroy(data->client); + g_free(data); } static struct ofono_ssn_driver driver = { diff --git a/drivers/isimodem/ussd.c b/drivers/isimodem/ussd.c index 80dcac87..78ac9fe7 100644 --- a/drivers/isimodem/ussd.c +++ b/drivers/isimodem/ussd.c @@ -181,7 +181,7 @@ static void isi_request(struct ofono_ussd *ussd, int dcs, { (uint8_t *)pdu, len } }; - if (!cbd) + if (!cbd || !ud) goto error; if (g_isi_vsend(ud->client, iov, 2, SS_TIMEOUT, @@ -205,7 +205,7 @@ static void isi_cancel(struct ofono_ussd *ussd, 0x00 /* subblock count */ }; - if (!cbd) + if (!cbd || !ud) goto error; if (g_isi_send(ud->client, msg, sizeof(msg), SS_TIMEOUT, diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c index 6e7aa0ef..82f7eef1 100644 --- a/drivers/isimodem/voicecall.c +++ b/drivers/isimodem/voicecall.c @@ -1303,10 +1303,12 @@ static void isi_voicecall_remove(struct ofono_voicecall *call) { struct isi_voicecall *data = ofono_voicecall_get_data(call); - if (data) { - g_isi_client_destroy(data->client); - g_free(data); - } + if (!data) + return; + + ofono_voicecall_set_data(call, NULL); + g_isi_client_destroy(data->client); + g_free(data); } static struct ofono_voicecall_driver driver = { |