If the udev monitor or enumerate functions fail, we'll call the
udev_unref and udev_monitor_unref functions twice: once in the cleanup
path and once in the talloc destructor.
This change moves all cleanup to the talloc destructor, so we only do
the unrefs once.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
{
struct pb_udev *udev = p;
{
struct pb_udev *udev = p;
- udev_monitor_unref(udev->monitor);
- udev->monitor = NULL;
+ if (udev->monitor) {
+ udev_monitor_unref(udev->monitor);
+ udev->monitor = NULL;
+ }
- udev_unref(udev->udev);
- udev->udev = NULL;
+ if (udev->udev) {
+ udev_unref(udev->udev);
+ udev->udev = NULL;
+ }
struct pb_udev *udev;
int result;
struct pb_udev *udev;
int result;
- udev = talloc(handler, struct pb_udev);
+ udev = talloc_zero(handler, struct pb_udev);
talloc_set_destructor(udev, udev_destructor);
udev->handler = handler;
talloc_set_destructor(udev, udev_destructor);
udev->handler = handler;
if (!udev->udev) {
pb_log("udev_new failed\n");
if (!udev->udev) {
pb_log("udev_new failed\n");
}
udev_set_userdata(udev->udev, udev);
}
udev_set_userdata(udev->udev, udev);
result = udev_setup_monitor(udev->udev, &udev->monitor);
if (result)
result = udev_setup_monitor(udev->udev, &udev->monitor);
if (result)
result = udev_enumerate(udev->udev);
if (result)
result = udev_enumerate(udev->udev);
if (result)
waiter_register_io(waitset, udev_monitor_get_fd(udev->monitor), WAIT_IN,
udev_process, udev->monitor);
waiter_register_io(waitset, udev_monitor_get_fd(udev->monitor), WAIT_IN,
udev_process, udev->monitor);
-fail_monitor:
- udev_monitor_unref(udev->monitor);
-fail_enumerate:
- udev_unref(udev->udev);
-fail_new:
talloc_free(udev);
return NULL;
}
talloc_free(udev);
return NULL;
}