dbus_error handling was being abused quite wrongly. This might even fix a couple of potential memory leaks... Paul Sladen diff -ur hal-0.5.9.1/hald/linux/addons/addon-acpi.c hal-0.5.9.1.sladen/hald/linux/addons/addon-acpi.c --- hal-0.5.9.1/hald/linux/addons/addon-acpi.c 2007-10-04 18:55:13.000000000 +0300 +++ hal-0.5.9.1.sladen/hald/linux/addons/addon-acpi.c 2007-10-04 20:03:07.000000000 +0300 @@ -185,6 +185,8 @@ DBusError error; char event[256]; + dbus_error_init (&error); + while (fgets (event, sizeof event, eventfp)) { HAL_DEBUG (("event is '%s'", event)); @@ -200,12 +202,16 @@ HAL_DEBUG (("button event")); /* TODO: only rescan if button got state */ - dbus_error_init (&error); if (libhal_device_rescan (ctx, udi, &error)) { - dbus_error_init (&error); + if (dbus_error_is_set (&error)) { + dbus_error_free (&error); + } type = libhal_device_get_property_string(ctx, udi, "button.type", &error); + if (dbus_error_is_set (&error)) { + dbus_error_free (&error); + } if (type != NULL) { libhal_device_emit_condition (ctx, udi, "ButtonPressed", type, &error); @@ -216,31 +222,28 @@ } } else if (strncmp (acpi_path, "ac_adapter", sizeof ("ac_adapter") - 1) == 0) { HAL_DEBUG (("ac_adapter event")); - dbus_error_init (&error); libhal_device_rescan (ctx, udi, &error); } else if (strncmp (acpi_path, "battery", sizeof ("battery") - 1) == 0) { HAL_DEBUG (("battery event")); - dbus_error_init (&error); libhal_device_rescan (ctx, udi, &error); #ifdef BUILD_ACPI_IBM } else if (strncmp (acpi_path, "ibm/hotkey", sizeof ("ibm/hotkey") -1) == 0) { /* handle ibm ACPI hotkey events*/ handle_ibm_acpi_events(ctx, acpi_num1, acpi_num2); #endif - } + } } else { HAL_DEBUG (("cannot parse event")); } if (dbus_error_is_set (&error)) { - /* Free the error (which include a dbus_error_init()) - This should prevent errors if a call above fails */ + /* NB: dbus_error_free (&error) performs dbus_error_init (error); */ dbus_error_free (&error); } } - dbus_error_free (&error); + /* dbus-errors.c: "An error only needs to be freed if it's been set, not if it's merely been initialized." */ fclose (eventfp); }