From: Daniel Wagner <[email protected]>
__connman_service_disconnect_all() should not iterate over
the service_list directly because the ordering of the
services can change when disconnecting a service (e.g. default
service). The iterator might be invalid after a
__connman_service_disconnect() call.
It's better to iterate over a temporary list.
---
src/service.c | 13 +++++++++++--
1 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/service.c b/src/service.c
index a6c764c..ea67acf 100644
--- a/src/service.c
+++ b/src/service.c
@@ -4547,6 +4547,7 @@ int __connman_service_disconnect(struct connman_service
*service)
int __connman_service_disconnect_all(void)
{
GSequenceIter *iter;
+ GSList *services, *list;
DBG("");
@@ -4555,15 +4556,23 @@ int __connman_service_disconnect_all(void)
while (g_sequence_iter_is_end(iter) == FALSE) {
struct connman_service *service = g_sequence_get(iter);
+ services = g_slist_prepend(services, service);
+
+ iter = g_sequence_iter_next(iter);
+ }
+
+ for (list = services; list != NULL; list = list->next) {
+ struct connman_service *service = list->data;
+
service->ignore = TRUE;
set_reconnect_state(service, FALSE);
__connman_service_disconnect(service);
-
- iter = g_sequence_iter_next(iter);
}
+ g_slist_free(list);
+
return 0;
}
--
1.7.6
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman