Add more exceptional checking to fix BS issue caused by setting_dbus_handler_fini
authorKairong Yin <kairong78.yin@samsung.com>
Sat, 27 Oct 2012 11:23:38 +0000 (19:23 +0800)
committerKairong Yin <kairong78.yin@samsung.com>
Sat, 27 Oct 2012 11:23:38 +0000 (19:23 +0800)
Change-Id: I86f74a173c1b95ae99620f1a3a19a5e9a53d133a

src/setting-plugin.c

index fee521b..026e00f 100755 (executable)
@@ -341,64 +341,74 @@ static void __send_string_msg(xmlNode* xmlObj, char *string)
 int setting_dbus_handler_init(void* user_data)
 {
        SETTING_TRACE_BEGIN;
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
-
-    dbus_error_init(&error);
-    bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
-    if (!bus)
-    {
-        SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
-
-    dbus_connection_setup_with_g_main(bus, NULL);
-    snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       if (bus)
+       {
+               SETTING_TRACE("already get a bus, need release first.");
+               setting_dbus_handler_fini();
+       }
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
+       dbus_error_init(&error);
+       bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+       if (!bus)
+       {
+               SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
+               dbus_error_free(&error);
+               return -1;
+       }
 
-    dbus_bus_add_match(bus, rule, &error);
-    if (dbus_error_is_set(&error))
-    {
-        SETTING_TRACE("Fail to rule set; %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
+       dbus_connection_setup_with_g_main(bus, NULL);
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
 
-    if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
-    {
-        return -1;
-    }
+       dbus_bus_add_match(bus, rule, &error);
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule set; %s", error.message);
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    SETTING_TRACE("app signal initialized");
+       if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
+       {
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    return 0;
+       SETTING_TRACE("app signal initialized");
+       return 0;
 }
 
-
 int setting_dbus_handler_fini(void)
 {
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
-
-       if (bus)
+       //do safty checking first.
+       setting_retvm_if(!bus, 0, "!bus");
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
+
+       dbus_error_init(&error);
+       dbus_connection_remove_filter(bus, __signal_filter, NULL);
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       dbus_bus_remove_match(bus, rule, &error);
+
+       if (dbus_error_is_set(&error))
        {
-               dbus_error_init(&error);
-               dbus_connection_remove_filter(bus, __signal_filter, NULL);
-               snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
-               dbus_bus_remove_match(bus, rule, &error);
-
-               if (dbus_error_is_set(&error))
-               {
-                       SETTING_TRACE("Fail to rule unset: %s", error.message);
-                       dbus_error_free(&error);
-                       return -1;
-               }
-
-               dbus_connection_close(bus);
-               bus = NULL;
-               SETTING_TRACE("app signal finalized");
+               SETTING_TRACE("Fail to rule unset: %s", error.message);
+               dbus_error_free(&error);
+               //return -1;
        }
-    return 0;
+
+       dbus_connection_close(bus);
+       bus = NULL;
+       SETTING_TRACE("app signal finalized");
+       return 0;
 }
 
 /////////////////////////////