When the system shuts downn, we destroy the service_list. The destroy
callback on the service_list sequence is service_free() which will
call the provider code. Provider wants to iterater over the
service_list we are currently freeing. This results into a crash.
#0 0x0000003edd680991 in __strlen_sse2 () from /lib64/libc.so.6
#1 0x0000003ee0a280fb in ?? () from /lib64/libdbus-1.so.3
#2 0x0000003ee0a15f19 in ?? () from /lib64/libdbus-1.so.3
#3 0x0000003ee0a19c0a in dbus_message_iter_append_basic () from /lib64/libdbus-1.so.3
#4 0x000000000043985b in append_path (value=0x6a7800, user_data=0x7fffffffe350)
at src/service.c:121
#5 0x0000003edf65af07 in g_sequence_foreach_range () from /lib64/libglib-2.0.so.0
#6 0x0000000000439888 in __connman_service_list (iter=0x7fffffffe350, user_data=0x0)
at src/service.c:127
#7 0x000000000045971e in connman_dbus_property_append_array (iter=0x7fffffffe440, key=
0x472cd8 "Services", type=111, function=0x439860 <__connman_service_list>, user_data=0x0)
at src/dbus.c:204
#8 0x000000000045990a in connman_dbus_property_changed_array (path=0x472ca0 "/", interface=
0x472c8c "net.connman.Manager", key=0x472cd8 "Services", type=111, function=
0x439860 <__connman_service_list>, user_data=0x0) at src/dbus.c:271
#9 0x00000000004391cd in services_changed (user_data=0x0) at src/profile.c:120
#10 0x000000000043924c in __connman_profile_changed (delayed=0) at src/profile.c:143
#11 0x000000000043f467 in service_free (user_data=0x6aab40) at src/service.c:2951
#12 0x0000003edf65aac8 in ?? () from /lib64/libglib-2.0.so.0
#13 0x0000003edf65aaa2 in ?? () from /lib64/libglib-2.0.so.0
#14 0x0000003edf65ae39 in g_sequence_free () from /lib64/libglib-2.0.so.0
#15 0x000000000044459f in __connman_service_cleanup () at src/service.c:5432
#16 0x000000000042ef5f in main (argc=1, argv=0x7fffffffe6b8) at src/main.c:412
void __connman_service_cleanup(void)
{
+ GSequence *list;
+
DBG("");
- g_sequence_free(service_list);
+ list = service_list;
service_list = NULL;
+ g_sequence_free(list);
g_hash_table_destroy(service_hash);
service_hash = NULL;