On Mon, Jul 27, 2009 at 02:58:39PM +0200, Rémi Cardona wrote: > 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 <[email protected]> > > Signed-off-by: Rémi Cardona <[email protected]> > --- > 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);
Acked-by: Peter Hutterer <[email protected]> Cheers, Peter _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
