[libvirt] [PATCH 1/1] Cleanups for udev init code

Matthias Bolte matthias.bolte at googlemail.com
Tue Jan 26 22:39:14 UTC 2010


2010/1/26 David Allan <dallan at redhat.com>:
> ---
>  src/node_device/node_device_udev.c |   34 +++++++++++++---------------------
>  1 files changed, 13 insertions(+), 21 deletions(-)
>
> diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
> index dcd889d..6895ac5 100644
> --- a/src/node_device/node_device_udev.c
> +++ b/src/node_device/node_device_udev.c
> @@ -1368,8 +1368,9 @@ static int udevDeviceMonitorShutdown(void)
>
>         priv = driverState->privateData;
>
> -        if (priv->watch != -1)
> +        if (priv->watch != -1) {
>             virEventRemoveHandle(priv->watch);
> +        }
>
>         udev_monitor = DRV_STATE_UDEV_MONITOR(driverState);
>

Due to your changes to udevDeviceMonitorStartup it is possible that
udevDeviceMonitorShutdown is called with driverState != NULL and
driverState->privateData == NULL. In this case 'if (priv->watch !=
-1)' will segfault and 'udev_monitor =
DRV_STATE_UDEV_MONITOR(driverState);' will segfault also. Changing it
like this will fix the problem:

        if (priv != NULL) {
            if (priv->watch != -1)
                virEventRemoveHandle(priv->watch);

            udev_monitor = DRV_STATE_UDEV_MONITOR(driverState);
        }

> @@ -1387,6 +1388,7 @@ static int udevDeviceMonitorShutdown(void)
>         virMutexDestroy(&driverState->lock);
>         VIR_FREE(driverState);
>         VIR_FREE(priv);
> +
>     } else {
>         ret = -1;
>     }
> @@ -1547,28 +1549,22 @@ static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
>  {
>     udevPrivate *priv = NULL;
>     struct udev *udev = NULL;
> -    int ret = 0;
> +    int ret = -1;
>
> -    if (VIR_ALLOC(priv) < 0) {
> +    if (VIR_ALLOC(driverState) < 0) {
>         virReportOOMError(NULL);
> -        ret = -1;
>         goto out;
>     }
>
> -    priv->watch = -1;
> -
> -    if (VIR_ALLOC(driverState) < 0) {
> +    if (VIR_ALLOC(priv) < 0) {
>         virReportOOMError(NULL);
> -        VIR_FREE(priv);
> -        ret = -1;
>         goto out;
>     }
>
> +    priv->watch = -1;
> +
>     if (virMutexInit(&driverState->lock) < 0) {
>         VIR_ERROR0("Failed to initialize mutex for driverState");
> -        VIR_FREE(priv);
> -        VIR_FREE(driverState);
> -        ret = -1;

priv leaks here.

>         goto out;
>     }
>
> @@ -1585,10 +1581,8 @@ static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
>
>     priv->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
>     if (priv->udev_monitor == NULL) {
> -        VIR_FREE(priv);

priv leaks here.

Moving the driverState->privateData = priv; line directly after the
priv->watch = -1; will fix this leaks.

>         nodeDeviceUnlock(driverState);
>         VIR_ERROR0("udev_monitor_new_from_netlink returned NULL");
> -        ret = -1;
>         goto out;
>     }
>
> @@ -1608,27 +1602,25 @@ static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
>     priv->watch = virEventAddHandle(udev_monitor_get_fd(priv->udev_monitor),
>                                     VIR_EVENT_HANDLE_READABLE,
>                                     udevEventHandleCallback, NULL, NULL);
> +
> +    nodeDeviceUnlock(driverState);
> +
>     if (priv->watch == -1) {
> -        nodeDeviceUnlock(driverState);
> -        ret = -1;
>         goto out;
>     }
>
> -    nodeDeviceUnlock(driverState);
> -
>     /* Create a fictional 'computer' device to root the device tree. */
>     if (udevSetupSystemDev() != 0) {
> -        ret = -1;
>         goto out;
>     }
>
>     /* Populate with known devices */
> -
>     if (udevEnumerateDevices(udev) != 0) {
> -        ret = -1;
>         goto out;
>     }
>
> +    ret = 0;
> +
>  out:
>     if (ret == -1) {
>         udevDeviceMonitorShutdown();
> --
> 1.6.5.5
>

Matthias




More information about the libvir-list mailing list