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>
This commit is contained in:
parent
8898203b0d
commit
b1c3dc6ae2
26
config/hal.c
26
config/hal.c
@ -474,13 +474,13 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info)
|
|||||||
char **devices;
|
char **devices;
|
||||||
int num_devices, i;
|
int num_devices, i;
|
||||||
|
|
||||||
|
if (info->hal_ctx)
|
||||||
|
return TRUE; /* already registered, pretend we did something */
|
||||||
|
|
||||||
info->system_bus = connection;
|
info->system_bus = connection;
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
|
|
||||||
if (info->hal_ctx)
|
|
||||||
return TRUE; /* already registered, pretend we did something */
|
|
||||||
|
|
||||||
info->hal_ctx = libhal_ctx_new();
|
info->hal_ctx = libhal_ctx_new();
|
||||||
if (!info->hal_ctx) {
|
if (!info->hal_ctx) {
|
||||||
LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n");
|
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",
|
LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n",
|
||||||
error.name ? error.name : "unknown error",
|
error.name ? error.name : "unknown error",
|
||||||
error.message ? error.message : "null");
|
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_added(info->hal_ctx, device_added);
|
||||||
libhal_ctx_set_device_removed(info->hal_ctx, device_removed);
|
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",
|
devices = libhal_find_device_by_capability(info->hal_ctx, "input",
|
||||||
&num_devices, &error);
|
&num_devices, &error);
|
||||||
/* FIXME: Get default devices if error is set. */
|
/* 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++)
|
for (i = 0; i < num_devices; i++)
|
||||||
device_added(info->hal_ctx, devices[i]);
|
device_added(info->hal_ctx, devices[i]);
|
||||||
libhal_free_string_array(devices);
|
libhal_free_string_array(devices);
|
||||||
@ -517,13 +523,19 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out_ctx2:
|
out_ctx:
|
||||||
if (!libhal_ctx_shutdown(info->hal_ctx, &error))
|
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",
|
LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n",
|
||||||
error.name ? error.name : "unknown error",
|
error.name ? error.name : "unknown error",
|
||||||
error.message ? error.message : "null");
|
error.message ? error.message : "null");
|
||||||
out_ctx:
|
dbus_error_free(&error);
|
||||||
|
}
|
||||||
libhal_ctx_free(info->hal_ctx);
|
libhal_ctx_free(info->hal_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
out_err:
|
out_err:
|
||||||
dbus_error_free(&error);
|
dbus_error_free(&error);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user