Improve error handling 01/254601/3
authortaemin.yeom <taemin.yeom@samsung.com>
Fri, 5 Mar 2021 05:38:18 +0000 (14:38 +0900)
committertaemin.yeom <taemin.yeom@samsung.com>
Fri, 5 Mar 2021 06:00:50 +0000 (15:00 +0900)
Change-Id: I2db312e210c37a457eb874d41f1adcfb5700885a
Signed-off-by: taemin.yeom <taemin.yeom@samsung.com>
src/libgdbus/dbus-system.c

index fdf1859..2b3fbb5 100644 (file)
@@ -1756,7 +1756,8 @@ int dbus_handle_method_sync_with_reply_var(const char *dest,
                                                GVariant **reply)
 {
        GError *err = NULL;
-       int ret = 0;
+       GVariant *ret = NULL;
+       int err_val = 0;
        dbus_handle_s *dh = NULL;
 
        if (!dest || !path || !iface || !method) {
@@ -1774,35 +1775,41 @@ int dbus_handle_method_sync_with_reply_var(const char *dest,
                return -ECOMM;
        }
 
-       *reply = g_dbus_connection_call_sync(dh->conn,
+       ret = g_dbus_connection_call_sync(dh->conn,
                        dest, path, iface, method,
                        param, NULL,
                        G_DBUS_CALL_FLAGS_NONE,
                        DBUS_REPLY_TIMEOUT,
                        NULL,
                        &err);
-       if (!(*reply) || err) {
+       if (!ret || err) {
                if (err) {
                        _E("failed to g_dbus_connection_call_sync:%s", err->message);
                        if (g_error_matches(err, G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED))
-                               ret = -EPERM;
+                               err_val = -EPERM;
                        else
-                               ret = -ECOMM;
+                               err_val = -ECOMM;
                        g_error_free(err);
-                       return ret;
+                       return err_val;
                } else {
                        _E("failed to g_dbus_connection_call_sync");
                }
                return -ECOMM;
        }
 
-       return ret;
+       if(reply)
+               *reply = ret;
+       else
+               g_variant_unref(ret);
+
+       return err_val;
 }
 
 int dbus_handle_method_sync_with_reply_var_timeout(const char *dest, const char *path,
        const char *iface, const char *method, GVariant *param, GVariant **reply, int timeout)
 {
        GError *err = NULL;
+       GVariant *ret;
        dbus_handle_s *dh = NULL;
 
        if (!dest || !path || !iface || !method) {
@@ -1820,14 +1827,14 @@ int dbus_handle_method_sync_with_reply_var_timeout(const char *dest, const char
                return -ECOMM;
        }
 
-       *reply = g_dbus_connection_call_sync(dh->conn,
+       ret = g_dbus_connection_call_sync(dh->conn,
                                        dest, path, iface, method,
                                        param, NULL,
                                        G_DBUS_CALL_FLAGS_NONE,
                                        timeout,
                                        NULL,
                                        &err);
-       if (!(*reply) || err) {
+       if (!ret || err) {
                if (err) {
                        _E("failed to g_dbus_connection_call_sync:%s", err->message);
                        g_error_free(err);
@@ -1837,6 +1844,11 @@ int dbus_handle_method_sync_with_reply_var_timeout(const char *dest, const char
                return -ECOMM;
        }
 
+       if(reply)
+               *reply = ret;
+       else
+               g_variant_unref(ret);
+
        return 0;
 }
 
@@ -1874,7 +1886,8 @@ int dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest,
                                                                int **out_fdlist,
                                                                int *out_size)
 {
-       int ret = 0;
+       int err_val = 0;
+       GVariant *ret = NULL;
        GError *err = NULL;
        dbus_handle_s *dh = NULL;
        GUnixFDList *g_infdlist = NULL;
@@ -1900,7 +1913,7 @@ int dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest,
                g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size);
                if (!g_infdlist) {
                        _E("failed to g_unix_fd_list_new_from_array\n");
-                       ret = -EAGAIN;
+                       err_val = -EAGAIN;
                        goto out;
                }
                //g_infdlist = g_unix_fd_list_new();
@@ -1908,14 +1921,14 @@ int dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest,
        }
 
        /* send message */
-       *reply = g_dbus_connection_call_with_unix_fd_list_sync(dh->conn,
+       ret = g_dbus_connection_call_with_unix_fd_list_sync(dh->conn,
                dest, path, iface, method,
                param, NULL,
                G_DBUS_CALL_FLAGS_NONE,
                -1,
                g_infdlist, &g_outfdlist,
                NULL, &err);
-       if (!(*reply) || err) {
+       if (!ret || err) {
                if (err) {
                        _E("failed to g_dbus_connection_call_with_unix_fd_list_sync:%s", err->message);
                        g_error_free(err);
@@ -1926,10 +1939,15 @@ int dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest,
                        if (g_infdlist)
                                g_object_unref(g_infdlist);
                }
-               ret = -EAGAIN;
+               err_val = -EAGAIN;
                goto out;
        }
 
+       if(reply)
+               *reply = ret;
+       else
+               g_variant_unref(ret);
+
        /* copy fds to out array */
        if (g_outfdlist) {
                *out_size = g_unix_fd_list_get_length(g_outfdlist);
@@ -1940,7 +1958,7 @@ int dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest,
 out:
        if (g_outfdlist)
                g_object_unref(g_outfdlist);
-       return ret;
+       return err_val;
 }
 
 int dbus_handle_method_sync_var(const char *dest,
@@ -1951,6 +1969,7 @@ int dbus_handle_method_sync_var(const char *dest,
                                int *output)
 {
        int ret = 0;
+       int result;
        gboolean result_bool;
        GVariant *reply = NULL;
 
@@ -1967,10 +1986,13 @@ int dbus_handle_method_sync_var(const char *dest,
                return -ECOMM;
 
        if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) {
-               g_variant_get(reply, "(i)", output);
+               g_variant_get(reply, "(i)", &result);
+               if(output)
+                       *output = result;
        } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) {
                g_variant_get(reply, "(b)", &result_bool);
-               *output = (int)result_bool;
+               if(output)
+                       *output = (int)result_bool;
        } else {
                ret = -ENOMSG;
        }