mbm: Fix crash from processing multiple *EMRDY
authorDenis Kenzior <denkenz@gmail.com>
Thu, 16 Aug 2012 16:39:22 +0000 (11:39 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Thu, 16 Aug 2012 16:39:22 +0000 (11:39 -0500)
Sometimes we see the *EMRDY notification before we query, and trigger
initialization procedures twice.

plugins/mbm.c

index 71555ee..3299bc2 100644 (file)
@@ -59,10 +59,13 @@ enum mbm_variant {
        MBM_DELL_D5530,         /* OEM of F3507g */
 };
 
+#define MBM_FLAG_HAVE_SIM 0x1
+#define MBM_FLAG_SAW_EMRDY 0x2
+
 struct mbm_data {
        GAtChat *modem_port;
        GAtChat *data_port;
-       gboolean have_sim;
+       unsigned int flags;
        struct ofono_location_reporting *lr;
        enum mbm_variant variant;
        struct at_util_sim_state_query *sim_state_query;
@@ -134,7 +137,7 @@ static void sim_state_cb(gboolean present, gpointer user_data)
        at_util_sim_state_query_free(data->sim_state_query);
        data->sim_state_query = NULL;
 
-       data->have_sim = present;
+       data->flags |= MBM_FLAG_HAVE_SIM;
        ofono_modem_set_powered(modem, TRUE);
 }
 
@@ -220,6 +223,9 @@ static void emrdy_notifier(GAtResult *result, gpointer user_data)
 
        DBG("");
 
+       if (data->flags & MBM_FLAG_SAW_EMRDY)
+               return;
+
        g_at_result_iter_init(&iter, result);
 
        if (g_at_result_iter_next(&iter, "*EMRDY:") == FALSE)
@@ -230,6 +236,8 @@ static void emrdy_notifier(GAtResult *result, gpointer user_data)
        if (status != 1)
                return;
 
+       data->flags |= MBM_FLAG_SAW_EMRDY;
+
        g_at_chat_send(data->modem_port, "AT+CFUN?", cfun_prefix,
                                        cfun_query, modem, NULL);
 }
@@ -409,7 +417,7 @@ static void mbm_pre_sim(struct ofono_modem *modem)
        sim = ofono_sim_create(modem, OFONO_VENDOR_MBM,
                                        "atmodem", data->modem_port);
 
-       if (data->have_sim && sim)
+       if ((data->flags & MBM_FLAG_HAVE_SIM) && sim)
                ofono_sim_inserted_notify(sim, TRUE);
 }