[libvirt] [PATCHv2 2/6] interface: udev bridge code error handling updates

Laine Stump laine at laine.org
Thu Feb 21 20:59:48 UTC 2013


Ah, *now* I understand. You did the extra error checking in a separate
patch!

On 02/20/2013 02:56 PM, Doug Goldstein wrote:
> Based on feedback from Laine Stump, improve a number of the error
> handling cases to report the issue to the user instead of not generating
> data or giving vague errors. Added the bridge device name to every error
> message as well to make it clear which bridge failed.
> ---
>  src/interface/interface_backend_udev.c | 61 ++++++++++++++++++++++++++--------
>  1 file changed, 47 insertions(+), 14 deletions(-)
>
> diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
> index 780a472..f5b44ea 100644
> --- a/src/interface/interface_backend_udev.c
> +++ b/src/interface/interface_backend_udev.c
> @@ -551,34 +551,60 @@ udevIfaceGetIfaceDefBridge(struct udev *udev,
>      struct dirent **member_list = NULL;
>      int member_count = 0;
>      char *member_path;
> -    const char *stp_str;
> +    const char *tmp_str;
>      int stp;
>      int i;
>  
>      /* Set our type to Bridge  */
>      ifacedef->type = VIR_INTERFACE_TYPE_BRIDGE;
>  
> -    /* Bridge specifics */
> -    ifacedef->data.bridge.delay =
> -        strdup(udev_device_get_sysattr_value(dev, "bridge/forward_delay"));
> +    /* Retrieve the forward delay */
> +    tmp_str = udev_device_get_sysattr_value(dev, "bridge/forward_delay");
> +    if (!tmp_str) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                _("Could not retrieve 'bridge/forward_delay' for '%s'"), name);
> +        goto err;

Please name this label "error" instead of "err" to fit with the rest of
libvirt.

> +    }
> +
> +    ifacedef->data.bridge.delay = strdup(tmp_str);
>      if (!ifacedef->data.bridge.delay) {
>          virReportOOMError();
> -        goto cleanup;
> +        goto err;
>      }
>  
> -    stp_str = udev_device_get_sysattr_value(dev, "bridge/stp_state");
> -    if (virStrToLong_i(stp_str, NULL, 10, &stp) < 0) {
> +    /* Retrieve Spanning Tree State. Valid values = -1, 0, 1 */
> +    tmp_str = udev_device_get_sysattr_value(dev, "bridge/stp_state");
> +    if (!tmp_str) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
> -                _("Could not parse STP state '%s'"), stp_str);
> -        goto cleanup;
> +            _("Could not retrieve 'bridge/stp_state' for '%s'"), name);
> +        goto err;
> +    }
> +
> +    if (virStrToLong_i(tmp_str, NULL, 10, &stp) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                _("Could not parse 'bridge/stp_state' '%s' for '%s'"),
> +                tmp_str, name);
> +        goto err;
> +    }
> +
> +    switch (stp) {
> +    case -1:
> +    case 0:
> +    case 1:
> +        ifacedef->data.bridge.stp = stp;
> +        break;
> +    default:
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +            _("Invalid STP state value %d received for '%s'. Must be "
> +              "-1, 0, or 1."), stp, name);
> +        goto err;
>      }
> -    ifacedef->data.bridge.stp = stp;
>  
>      /* Members of the bridge */
>      if (virAsprintf(&member_path, "%s/%s",
>                  udev_device_get_syspath(dev), "brif") < 0) {
>          virReportOOMError();
> -        goto cleanup;
> +        goto err;
>      }
>  
>      /* Get each member of the bridge */
> @@ -592,19 +618,26 @@ udevIfaceGetIfaceDefBridge(struct udev *udev,
>          virReportSystemError(errno,
>                  _("Could not get members of bridge '%s'"),
>                  name);
> -        goto cleanup;
> +        goto err;
>      }
>  
>      /* Allocate our list of member devices */
>      if (VIR_ALLOC_N(ifacedef->data.bridge.itf, member_count) < 0) {
>          virReportOOMError();
> -        goto cleanup;
> +        goto err;
>      }
>      ifacedef->data.bridge.nbItf = member_count;
>  
> +    /* Get the interface defintions for each member of the bridge */
>      for (i = 0; i < member_count; i++) {
>          ifacedef->data.bridge.itf[i] =
>              udevIfaceGetIfaceDef(udev, member_list[i]->d_name);
> +        if (!ifacedef->data.bridge.itf[i]) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                _("Could not get interface information for '%s', which is "
> +                  "a member of bridge '%s'"), member_list[i]->d_name, name);
> +            goto err;
> +        }
>          VIR_FREE(member_list[i]);
>      }
>  
> @@ -612,7 +645,7 @@ udevIfaceGetIfaceDefBridge(struct udev *udev,
>  
>      return 0;
>  
> -cleanup:
> +err:
>      for (i = 0; i < member_count; i++) {
>          VIR_FREE(member_list[i]);
>      }

ACK with "err" changed to "error".




More information about the libvir-list mailing list