From 1b0113f5303c03b34176fc60024c0827da348141 Mon Sep 17 00:00:00 2001 From: "taemin.yeom" Date: Fri, 5 Mar 2021 14:38:18 +0900 Subject: [PATCH] Improve error handling Change-Id: I2db312e210c37a457eb874d41f1adcfb5700885a Signed-off-by: taemin.yeom --- src/libgdbus/dbus-system.c | 56 ++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/libgdbus/dbus-system.c b/src/libgdbus/dbus-system.c index fdf1859..2b3fbb5 100644 --- a/src/libgdbus/dbus-system.c +++ b/src/libgdbus/dbus-system.c @@ -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; } -- 2.34.1