From 08ff3a756d879711dc409c105a531e9dd52ec0eb Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 12 Jul 2011 11:47:05 +0200 Subject: [PATCH] service: Cleanup fix 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 --- src/service.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/service.c b/src/service.c index bfd94a5..5e94cd6 100644 --- a/src/service.c +++ b/src/service.c @@ -5396,10 +5396,13 @@ int __connman_service_init(void) 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; -- 2.7.4