[PATCH] config: add HAL error checks

Rémi Cardona remi at gentoo.org
Mon Jul 27 05:58:39 PDT 2009


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 at gmx.net>
Signed-off-by: Rémi Cardona <remi at gentoo.org>
---
 config/hal.c | 29 ++++++++++++++++++++---------
 1 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/config/hal.c b/config/hal.c
index 36fa839..a7a086f 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");
@@ -499,7 +499,7 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info)
 if (!libhal_device_property_watch_all(info->hal_ctx, &error)) {
 LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n",
 error.name, error.message);
- 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);
@@ -507,6 +507,11 @@ 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.message);
+ goto out_ctx;
+ }
 for (i = 0; i < num_devices; i++)
 device_added(info->hal_ctx, devices[i]);
 libhal_free_string_array(devices);
@@ -515,12 +520,18 @@ 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.message);
 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.message);
+ dbus_error_free(&error);
+ }
+ libhal_ctx_free(info->hal_ctx); 
+ }
+
 out_err:
 dbus_error_free(&error);
 
-- 
1.6.3.3


More information about the xorg-devel mailing list

AltStyle によって変換されたページ (->オリジナル) /