[PATCH 50/55] hyperv: use GLib auto-cleanup in hypervSerializeEprParam

Laine Stump laine at redhat.com
Fri Jan 22 08:39:43 UTC 2021


On 1/21/21 1:51 PM, Matt Coleman wrote:
> Signed-off-by: Matt Coleman <matt at datto.com>
> ---
>   src/hyperv/hyperv_wmi.c | 56 ++++++++++++++++-------------------------
>   1 file changed, 21 insertions(+), 35 deletions(-)
>
> diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
> index ed0091ba06..c1325b2ccc 100644
> --- a/src/hyperv/hyperv_wmi.c
> +++ b/src/hyperv/hyperv_wmi.c
> @@ -455,23 +455,21 @@ static int
>   hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
>                           const char *resourceUri, WsXmlNodeH *methodNode)
>   {
> -    int result = -1;
>       WsXmlNodeH xmlNodeParam = NULL,
>                  xmlNodeTemp = NULL,
>                  xmlNodeAddr = NULL,
>                  xmlNodeRef = NULL;
> -    WsXmlDocH xmlDocResponse = NULL;
> -    WsXmlNsH ns = NULL;
> -    client_opt_t *options = NULL;
> -    filter_t *filter = NULL;
> -    char *enumContext = NULL;
> -    char *query_string = NULL;
> +    g_auto(WsXmlDocH) xmlDocResponse = NULL;
> +    g_autoptr(client_opt_t) options = NULL;
> +    g_autoptr(filter_t) filter = NULL;
> +    g_autofree char *enumContext = NULL;
> +    g_autofree char *query_string = NULL;
>   
>       /* init and set up options */
>       options = wsmc_options_init();
>       if (!options) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not init options"));
> -        goto cleanup;
> +        return -1;
>       }
>       wsmc_set_action_option(options, FLAG_ENUMERATION_ENUM_EPR);
>   
> @@ -480,14 +478,14 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
>       filter = filter_create_simple(WSM_WQL_FILTER_DIALECT, query_string);
>       if (!filter) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not create WQL filter"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       /* enumerate based on the filter from this query */
>       xmlDocResponse = wsmc_action_enumerate(priv->client, p->epr.info->rootUri,
>                                              options, filter);
>       if (hypervVerifyResponse(priv->client, xmlDocResponse, "enumeration") < 0)
> -        goto cleanup;
> +        return -1;
>   
>       /* Get context */
>       enumContext = wsmc_get_enum_context(xmlDocResponse);
> @@ -498,41 +496,41 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
>                                         filter, enumContext);
>   
>       if (hypervVerifyResponse(priv->client, xmlDocResponse, "pull") < 0)
> -        goto cleanup;
> +        return -1;
>   
>       /* drill down and extract EPR node children */
>       if (!(xmlNodeTemp = ws_xml_get_soap_body(xmlDocResponse))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not get SOAP body"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       if (!(xmlNodeTemp = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ENUMERATION,
>                                            WSENUM_PULL_RESP))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not get response"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       if (!(xmlNodeTemp = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ENUMERATION, WSENUM_ITEMS))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not get response items"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       if (!(xmlNodeTemp = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ADDRESSING, WSA_EPR))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not get EPR items"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       if (!(xmlNodeAddr = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ADDRESSING,
>                                            WSA_ADDRESS))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not get EPR address"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       if (!(xmlNodeRef = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ADDRESSING,
>                                           WSA_REFERENCE_PARAMETERS))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Could not lookup EPR item reference parameters"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       /* now build a new xml doc with the EPR node children */
> @@ -540,38 +538,26 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
>                                             p->epr.name, NULL))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Could not add child node to methodNode"));
> -        goto cleanup;
> +        return -1;
>       }
>   
> -    if (!(ns = ws_xml_ns_add(xmlNodeParam,
> -                             "http://schemas.xmlsoap.org/ws/2004/08/addressing", "a"))) {
> +    if (!ws_xml_ns_add(xmlNodeParam, "http://schemas.xmlsoap.org/ws/2004/08/addressing", "a")) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Could not set namespace address for xmlNodeParam"));
> -        goto cleanup;
> +        return -1;
>       }
>   
> -    if (!(ns = ws_xml_ns_add(xmlNodeParam,
> -                             "http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd", "w"))) {
> +    if (!ws_xml_ns_add(xmlNodeParam, "http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd", "w")) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Could not set wsman namespace address for xmlNodeParam"));
> -        goto cleanup;
> +        return -1;
>       }
>   
>       ws_xml_duplicate_tree(xmlNodeParam, xmlNodeAddr);
>       ws_xml_duplicate_tree(xmlNodeParam, xmlNodeRef);
>   
>       /* we did it! */
> -    result = 0;
> -
> - cleanup:
> -    if (options != NULL)
> -        wsmc_options_destroy(options);
> -    if (filter != NULL)
> -        filter_destroy(filter);


Same question as before about whether these cleanup functions can safely 
be called with a NULL pointer.


> -    ws_xml_destroy_doc(xmlDocResponse);
> -    VIR_FREE(enumContext);
> -    VIR_FREE(query_string);
> -    return result;
> +    return 0;
>   }
>   
>   





More information about the libvir-list mailing list