bug-parted
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH parted 2/2] _device_unregister: check for unregistering the s


From: Jim Meyering
Subject: Re: [PATCH parted 2/2] _device_unregister: check for unregistering the same device twice
Date: Fri, 30 Apr 2010 17:44:43 +0200

Hans de Goede wrote:
> _device_unregister() can get called 2 times for the same device if
> a libparted user explictly removes the device from the cache using
> ped_device_cache_remove(), it gets called and it then becomes the
> user's responsibility to free the PedDevice by calling
> ped_device_destroy(). ped_device_destroy() will then call
> _device_unregister() a second time with the same device, so if the
> device is not found in the list, do nothing.
>
> * libparted/device.c(_device_unregister): Check for unregistering
> the same device twice.

Thank you for the patch.
I've pushed it, with this added to the commit log:

  Reported by Jan Stodola in http://bugzilla.redhat.com/568346

That should be enough to create a test suite addition,
if someone finds the time.

> +  allow using ped_device_cache_remove(dev) followed by a (later)
> +  ped_device_destroy() without corrupting the device cache.
> +
>  ** Changes in behavior
>
>    libparted no longer issues an exception/warning about >512-byte
> diff --git a/libparted/device.c b/libparted/device.c
> index f20121b..00f49a3 100644
> --- a/libparted/device.c
> +++ b/libparted/device.c
> @@ -73,6 +73,16 @@ _device_unregister (PedDevice* dev)
>               if (walk == dev) break;
>       }
>
> +     /* This function may be called twice for the same device if a
> +        libparted user explictly removes the device from the cache using
> +        ped_device_cache_remove(), we get called and it then becomes the
> +        user's responsibility to free the PedDevice by calling
> +        ped_device_destroy().
> +        ped_device_destroy() will then call us a second time, so if the
> +        device is not found in the list do nothing. */
> +     if (walk == NULL)
> +             return;
> +
>       if (last)
>               last->next = dev->next;
>       else




reply via email to

[Prev in Thread] Current Thread [Next in Thread]