discomfitor pushed a commit to branch enlightenment-0.21.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=f206194feab63ab847af208def540a0e7ebbe00c

commit f206194feab63ab847af208def540a0e7ebbe00c
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sat Jul 29 08:53:06 2017 +0900

    wireless module - dont segv e if connman daemon restarts
    
    so i get a new service of type WIRELESS_SERVICE_TYPE_NONE that's going
    to suck when accessing arrays by type like wireless does like
    array[cs->type] ... so check type value and if its invalid kill off
    the cs as we can't do much useful with it. this fixes an actual segv e
    gets if you restart the connamn daemon while e runs.
---
 src/modules/wireless/connman.c | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/modules/wireless/connman.c b/src/modules/wireless/connman.c
index dccecf296..675ce441b 100644
--- a/src/modules/wireless/connman.c
+++ b/src/modules/wireless/connman.c
@@ -628,7 +628,7 @@ _connman_service_parse_prop_changed(Connman_Service *cs, 
const char *prop_name,
      _connman_service_parse_stringarray(value, &cs->domain_servers);
 }
 
-static void
+static Eina_Bool
 _connman_service_prop_dict_changed(Connman_Service *cs, Eldbus_Message_Iter 
*props)
 {
    Eldbus_Message_Iter *dict;
@@ -641,8 +641,15 @@ _connman_service_prop_dict_changed(Connman_Service *cs, 
Eldbus_Message_Iter *pro
         if (eldbus_message_iter_arguments_get(dict, "sv", &name, &var))
           _connman_service_parse_prop_changed(cs, name, var);
      }
-   if (_connman_service_is_connected(cs))
-     _connman_update_current_network(cs, cs->type);
+   if ((cs->type <= CONNMAN_SERVICE_TYPE_NONE) ||
+       (cs->type >= CONNMAN_SERVICE_TYPE_LAST))
+     return EINA_FALSE;
+   else
+     {
+        if (_connman_service_is_connected(cs))
+          _connman_update_current_network(cs, cs->type);
+     }
+   return EINA_TRUE;
 }
 
 static void
@@ -672,7 +679,12 @@ _connman_service_new(const char *path, Eldbus_Message_Iter 
*props)
    cs->handler = eldbus_proxy_signal_handler_add(cs->proxy, "PropertyChanged",
                                   _connman_service_property, cs);
 
-   _connman_service_prop_dict_changed(cs, props);
+   if (!_connman_service_prop_dict_changed(cs, props))
+     {
+        ERR("Service added of invalid type");
+        _connman_service_free(cs);
+        return NULL;
+     }
    connman_services_list[cs->type] = 
eina_inlist_append(connman_services_list[cs->type], EINA_INLIST_GET(cs));
    eina_hash_add(connman_services[cs->type], cs->path, cs);
    DBG("Added service: %p %s || proxy %p", cs, path, cs->proxy);
@@ -831,7 +843,7 @@ _connman_manager_getservices(void *data EINA_UNUSED, const 
Eldbus_Message *msg,
           continue;
 
         cs = _connman_service_new(path, inner_array);
-        update[cs->type] = 1;
+        if (cs) update[cs->type] = 1;
      }
    CONNMAN_SERVICE_TYPE_ITER(i)
      if (update[i]) _connman_update_networks(i);
@@ -948,7 +960,13 @@ _connman_manager_event_services(void *data EINA_UNUSED, 
const Eldbus_Message *ms
           {
              cs = eina_hash_find(connman_services[i], path);
              if (!cs) continue;
-             _connman_service_prop_dict_changed(cs, array);
+             if (!_connman_service_prop_dict_changed(cs, array))
+               {
+                  ERR("Service became an invalid type");
+                  cs->type = i;
+                  _connman_service_free(cs);
+                  continue;
+               }
              found = update[cs->type] = 1;
              DBG("Changed service: %p %s", cs, path);
              break;
@@ -956,7 +974,7 @@ _connman_manager_event_services(void *data EINA_UNUSED, 
const Eldbus_Message *ms
         if (!found)
           {
              cs = _connman_service_new(path, array);
-             update[cs->type] = 1;
+             if (cs) update[cs->type] = 1;
           }
      }
    CONNMAN_SERVICE_TYPE_ITER(i)

-- 


Reply via email to