Merge "[Fix] Dereference after free in sta_remove_callback()" into tizen
[platform/upstream/connman.git] / plugins / telephony.c
index 459095d..5c37d88 100755 (executable)
@@ -39,6 +39,7 @@
 #include <connman.h>
 
 #define PS_DBUS_SERVICE                                "com.tcore.ps"
+#define TELEPHONY_DBUS_SERVICE                 "org.tizen.telephony"
 
 #define PS_MASTER_INTERFACE                    PS_DBUS_SERVICE ".master"
 #define PS_MODEM_INTERFACE                     PS_DBUS_SERVICE ".modem"
@@ -131,7 +132,7 @@ static int __network_disconnect(struct connman_network *network);
 
 
 /* dbus request and reply */
-static int __dbus_request(const char *path, const char *interface,
+static int __dbus_request(const char *service, const char *path, const char *interface,
                        const char *method,
                        DBusPendingCallNotifyFunction notify, void *user_data,
                        DBusFreeFunction free_function, int type, ...);
@@ -365,7 +366,7 @@ static void __network_remove(struct connman_network *network)
        g_hash_table_remove(network_hash, path);
 }
 
-static int __dbus_request(const char *path, const char *interface,
+static int __dbus_request(const char *service, const char *path, const char *interface,
                const char *method,
                DBusPendingCallNotifyFunction notify, void *user_data,
                DBusFreeFunction free_function, int type, ...)
@@ -380,7 +381,7 @@ static int __dbus_request(const char *path, const char *interface,
        if (path == NULL)
                return -EINVAL;
 
-       message = dbus_message_new_method_call(PS_DBUS_SERVICE, path, interface, method);
+       message = dbus_message_new_method_call(service, path, interface, method);
        if (message == NULL)
                return -ENOMEM;
 
@@ -390,8 +391,10 @@ static int __dbus_request(const char *path, const char *interface,
        ok = dbus_message_append_args_valist(message, type, va);
        va_end(va);
 
-       if (!ok)
+       if (!ok) {
+               dbus_message_unref(message);
                return -ENOMEM;
+       }
 
        if (dbus_connection_send_with_reply(connection, message,
                                                &call, TIMEOUT) == FALSE) {
@@ -417,7 +420,7 @@ static int __request_get_modems(void)
 {
        DBG("request get modem");
        /* call connect master */
-       return __dbus_request("/", PS_MASTER_INTERFACE, GET_MODEMS,
+       return __dbus_request(PS_DBUS_SERVICE, "/", PS_MASTER_INTERFACE, GET_MODEMS,
                        __response_get_modems, NULL, NULL, DBUS_TYPE_INVALID);
 }
 
@@ -474,7 +477,7 @@ done:
 static int __request_get_services(const char *path)
 {
        DBG("request get service");
-       return __dbus_request(path, PS_MODEM_INTERFACE, GET_SERVICES,
+       return __dbus_request(PS_DBUS_SERVICE, path, PS_MODEM_INTERFACE, GET_SERVICES,
                        __response_get_services, g_strdup(path),
                        g_free, DBUS_TYPE_INVALID);
 }
@@ -489,10 +492,6 @@ static void __response_get_services(DBusPendingCall *call, void *user_data)
        struct telephony_modem *modem;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
-               return;
-       if (modem->device == NULL)
-               return;
 
        DBG("");
 
@@ -506,6 +505,9 @@ static void __response_get_services(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
+       if (modem == NULL || modem->device == NULL)
+               goto done;
+
        DBG("message signature (%s)", dbus_message_get_signature(reply));
 
        if (dbus_message_iter_init(reply, &args) == FALSE)
@@ -541,7 +543,7 @@ done:
 static int __request_get_contexts(struct telephony_modem *modem)
 {
        DBG("request get contexts");
-       return __dbus_request(modem->s_service->path,
+       return __dbus_request(PS_DBUS_SERVICE, modem->s_service->path,
                        PS_SERVICE_INTERFACE, GET_CONTEXTS,
                        __response_get_contexts, g_strdup(modem->path),
                        g_free, DBUS_TYPE_INVALID);
@@ -626,7 +628,7 @@ static int __request_network_activate(struct connman_network *network)
                g_free(subscribe_id);
        }
 
-       return __dbus_request(path, PS_CONTEXT_INTERFACE, ACTIVATE_CONTEXT,
+       return __dbus_request(PS_DBUS_SERVICE, path, PS_CONTEXT_INTERFACE, ACTIVATE_CONTEXT,
                        __response_network_activate,
                        g_strdup(path), NULL, DBUS_TYPE_INVALID);
 }
@@ -691,7 +693,7 @@ static int __request_network_deactivate(struct connman_network *network)
        const char *path = connman_network_get_string(network, "Path");
        DBG("network %p, path %s", network, path);
 
-       return __dbus_request(path, PS_CONTEXT_INTERFACE, DEACTIVATE_CONTEXT,
+       return __dbus_request(PS_DBUS_SERVICE, path, PS_CONTEXT_INTERFACE, DEACTIVATE_CONTEXT,
                        NULL, NULL, NULL, DBUS_TYPE_INVALID);
 }
 
@@ -734,7 +736,7 @@ static int __request_get_default_subscription_id(const char *path)
        telephony_modem_path = g_strdup_printf("/org/tizen/telephony%s", path);
        DBG("request get default subscription id %s", telephony_modem_path);
 
-       ret = __dbus_request(telephony_modem_path,
+       ret = __dbus_request(TELEPHONY_DBUS_SERVICE, telephony_modem_path,
                        "org.tizen.telephony.Network", "GetDefaultDataSubscription",
                        __response_get_default_subscription_id, NULL, NULL, DBUS_TYPE_INVALID);
 
@@ -1207,11 +1209,20 @@ static gboolean __set_network_context(
                                                ipv4_netmask, ipv4_gw);
 
        if (ipv4_dns1)
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(service, ipv4_dns1, FALSE,
+                               CONNMAN_IPCONFIG_TYPE_IPV4);
+#else
                __connman_service_nameserver_append(service, ipv4_dns1, FALSE);
+#endif
        //if (ipv4_dns2)
        if (ipv4_dns2 && !ipv4_dns1)
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(service, ipv4_dns2, FALSE,
+                               CONNMAN_IPCONFIG_TYPE_IPV4);
+#else
                __connman_service_nameserver_append(service, ipv4_dns2, FALSE);
-
+#endif
        /* ipv6 set */
        if (network->ipv6_address == NULL)
                network->ipv6_address =
@@ -1237,10 +1248,20 @@ static gboolean __set_network_context(
                                                64, ipv6_gw);
 
        if (ipv6_dns1)
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(service, ipv6_dns1, FALSE,
+                               CONNMAN_IPCONFIG_TYPE_IPV6);
+#else
                __connman_service_nameserver_append(service, ipv6_dns1, FALSE);
+#endif
        //if (ipv6_dns2)
        if (ipv6_dns2 && !ipv6_dns1)
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(service, ipv6_dns2, FALSE,
+                               CONNMAN_IPCONFIG_TYPE_IPV6);
+#else
                __connman_service_nameserver_append(service, ipv6_dns2, FALSE);
+#endif
 
        if (active == TRUE &&
                        connman_network_get_connected(network->network) == TRUE) {