summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-01-12 15:45:30 -0600
committerDenis Kenzior <denkenz@gmail.com>2010-01-12 15:45:30 -0600
commite9b40dbe7a98d18e2e7a6ac0a4efea7dff21ae32 (patch)
treecfcb4e46f28c88fee327c89d5ee57ea2dbe2f5c3
parent0382f6435357ec41be496702aa8d27bd6e1bf4c3 (diff)
downloadofono-e9b40dbe7a98d18e2e7a6ac0a4efea7dff21ae32.tar.bz2
Fix: Don't recurse infinitely
We try to keep the CPHS MBDN elementary file in sync with EFmbdn, unfortunately we share the same callback, which leads to infinite recursive writes. Also cleanup the set_mbdn_request structure if the write fails.
-rw-r--r--src/message-waiting.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/message-waiting.c b/src/message-waiting.c
index 3ac5553a..5db2659e 100644
--- a/src/message-waiting.c
+++ b/src/message-waiting.c
@@ -64,6 +64,7 @@ struct mbdn_set_request {
int mailbox;
struct ofono_phone_number number;
DBusMessage *msg;
+ gboolean cphs;
};
static const char *mw_message_waiting_property_name[5] = {
@@ -184,7 +185,7 @@ static DBusMessage *set_cphs_mbdn(struct ofono_message_waiting *mw,
req->mw = mw;
req->mailbox = mailbox;
string_to_phone_number(number, &req->number);
- req->msg = msg ? dbus_message_ref(msg) : NULL;
+ req->cphs = TRUE;
sim_adn_build(efmbdn, req->mw->ef_cphs_mbdn_length,
&req->number, NULL);
@@ -192,11 +193,13 @@ static DBusMessage *set_cphs_mbdn(struct ofono_message_waiting *mw,
if (ofono_sim_write(mw->sim, SIM_EF_CPHS_MBDN_FILEID, mbdn_set_cb,
OFONO_SIM_FILE_STRUCTURE_FIXED,
mw_mailbox_to_cphs_record[mailbox],
- efmbdn, mw->ef_cphs_mbdn_length, NULL) == -1) {
+ efmbdn, mw->ef_cphs_mbdn_length, req) == -1) {
+ g_free(req);
if (msg)
return __ofono_error_failed(msg);
- }
+ } else
+ req->msg = msg ? dbus_message_ref(msg) : NULL;
return NULL;
}
@@ -241,8 +244,9 @@ static void mbdn_set_cb(int ok, void *data)
/* Make a single attempt at keeping the CPHS version of the file
* in sync. */
- set_cphs_mbdn(req->mw, req->mailbox,
- phone_number_to_string(&req->number), NULL);
+ if (req->cphs == FALSE)
+ set_cphs_mbdn(req->mw, TRUE, req->mailbox,
+ phone_number_to_string(&req->number), NULL);
out:
if (req->msg && reply)
@@ -267,7 +271,7 @@ static DBusMessage *set_mbdn(struct ofono_message_waiting *mw, int mailbox,
req->mw = mw;
req->mailbox = mailbox;
string_to_phone_number(number, &req->number);
- req->msg = msg ? dbus_message_ref(msg) : NULL;
+ req->cphs = FALSE;
sim_adn_build(efmbdn, req->mw->efmbdn_length, &req->number, NULL);
@@ -279,7 +283,8 @@ static DBusMessage *set_mbdn(struct ofono_message_waiting *mw, int mailbox,
if (msg)
return __ofono_error_failed(msg);
- }
+ } else
+ req->msg = msg ? dbus_message_ref(msg) : NULL;
return NULL;
}