summaryrefslogtreecommitdiff
path: root/src/sim.c
diff options
context:
space:
mode:
authorSlava Monich <slava.monich@jolla.com>2017-10-27 16:15:59 +0300
committerDenis Kenzior <denkenz@gmail.com>2017-10-27 08:56:10 -0500
commit30c742439d973c8661b46d9e1b692cf52faf031e (patch)
tree83583fb482fa6604a5664291bb98297a95cc6c85 /src/sim.c
parent43c2bfdc52603599a8699750ac667f5c04ea8f8f (diff)
downloadofono-30c742439d973c8661b46d9e1b692cf52faf031e.tar.gz
sim: Move atom registration to the end of ofono_sim_register
The state needs to be checked prior to calling __ofono_atom_register because atom registration calls OFONO_ATOM_WATCH_CONDITION_REGISTERED callbacks each of which may call ofono_sim_inserted_notify. Should that happen, by the time __ofono_atom_register returns, ofono_sim will be in OFONO_SIM_STATE_INSERTED state and sim_initialize will be called twice if the initial state was OFONO_SIM_STATE_NOT_PRESENT. If nothing else, that results in memory leaks like this one (because IMSI will be queried twice, among other things): ==3017== 16 bytes in 1 blocks are definitely lost in loss record 187 of 475 ==3017== at 0x483F380: malloc (vg_replace_malloc.c:296) ==3017== by 0x4AFB0DF: g_malloc (gmem.c:94) ==3017== by 0x4B12185: g_strdup (gstrfuncs.c:363) ==3017== by 0xF79D3: sim_imsi_obtained (sim.c:1535) ==3017== by 0xF7BB3: sim_imsi_cb (sim.c:1594) ==3017== by 0x66C23: at_cimi_cb (sim.c:441) ==3017== by 0xA6B53: at_chat_finish_command (gatchat.c:459) ==3017== by 0xA6D9F: at_chat_handle_command_response (gatchat.c:521) ==3017== by 0xA70AF: have_line (gatchat.c:600) ==3017== by 0xA76DF: new_bytes (gatchat.c:759) ==3017== by 0xABACF: received_data (gatio.c:122) ==3017== by 0xAD093: watch_dispatch (gatmux.c:461) ==3017== by 0xAC5D3: dispatch_sources (gatmux.c:180) ==3017== by 0xAC98F: received_data (gatmux.c:265) ==3017== by 0x4AF606F: g_main_dispatch (gmain.c:3154) ==3017== by 0x4AF606F: g_main_context_dispatch (gmain.c:3769) ==3017== by 0x4AF631D: g_main_context_iterate.isra.4 (gmain.c:3840) ==3017== by 0x4AF658F: g_main_loop_run (gmain.c:4034) ==3017== by 0xBE8AF: main (main.c:261)
Diffstat (limited to 'src/sim.c')
-rw-r--r--src/sim.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/sim.c b/src/sim.c
index 88c04219..155f4212 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -3108,8 +3108,6 @@ void ofono_sim_register(struct ofono_sim *sim)
sim->spn_watches = __ofono_watchlist_new(g_free);
sim->simfs = sim_fs_new(sim, sim->driver);
- __ofono_atom_register(sim->atom, sim_unregister);
-
ofono_sim_add_state_watch(sim, sim_ready, sim, NULL);
if (sim->state > OFONO_SIM_STATE_NOT_PRESENT)
@@ -3118,6 +3116,8 @@ void ofono_sim_register(struct ofono_sim *sim)
sim->hfp_watch = __ofono_modem_add_atom_watch(modem,
OFONO_ATOM_TYPE_EMULATOR_HFP,
emulator_hfp_watch, sim, NULL);
+
+ __ofono_atom_register(sim->atom, sim_unregister);
}
void ofono_sim_remove(struct ofono_sim *sim)