diff options
author | Rémi Cardona <remi@gentoo.org> | 2009-07-27 12:07:51 +0200 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-07-29 15:49:36 -0700 |
commit | c941479ecc2dead9c3deaee2620c9b9518c3da9a (patch) | |
tree | 230c5085efd2338937c9ba7ae833629385f4e94c /config/hal.c | |
parent | 546f913ff5461dd93d4a0b29b24d2267557326c7 (diff) |
config: add HAL error checks
This patch simplifies error handling in the HAL code and fixes a
segfault if libhal_find_device_by_capability() failed.
Fixes http://bugs.gentoo.org/278760
Based on a patch by Martin von Gagern <Martin.vGagern@gmx.net>
Signed-off-by: Rémi Cardona <remi@gentoo.org>
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit b1c3dc6ae226db178420e3b5f297b94afc87c94c)
Diffstat (limited to 'config/hal.c')
-rw-r--r-- | config/hal.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/config/hal.c b/config/hal.c index 731d9b8fc..59bff6613 100644 --- a/config/hal.c +++ b/config/hal.c @@ -474,13 +474,13 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) char **devices; int num_devices, i; + if (info->hal_ctx) + return TRUE; /* already registered, pretend we did something */ + info->system_bus = connection; dbus_error_init(&error); - if (info->hal_ctx) - return TRUE; /* already registered, pretend we did something */ - info->hal_ctx = libhal_ctx_new(); if (!info->hal_ctx) { LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n"); @@ -501,7 +501,7 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n", error.name ? error.name : "unknown error", error.message ? error.message : "null"); - goto out_ctx2; + goto out_ctx; } libhal_ctx_set_device_added(info->hal_ctx, device_added); libhal_ctx_set_device_removed(info->hal_ctx, device_removed); @@ -509,6 +509,12 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) devices = libhal_find_device_by_capability(info->hal_ctx, "input", &num_devices, &error); /* FIXME: Get default devices if error is set. */ + if (dbus_error_is_set(&error)) { + LogMessage(X_ERROR, "config/hal: couldn't find input device: %s (%s)\n", + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); + goto out_ctx; + } for (i = 0; i < num_devices; i++) device_added(info->hal_ctx, devices[i]); libhal_free_string_array(devices); @@ -517,13 +523,19 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) return TRUE; -out_ctx2: - if (!libhal_ctx_shutdown(info->hal_ctx, &error)) - LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n", - error.name ? error.name : "unknown error", - error.message ? error.message : "null"); out_ctx: - libhal_ctx_free(info->hal_ctx); + dbus_error_free(&error); + + if (info->hal_ctx) { + if (!libhal_ctx_shutdown(info->hal_ctx, &error)) { + LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n", + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); + dbus_error_free(&error); + } + libhal_ctx_free(info->hal_ctx); + } + out_err: dbus_error_free(&error); |