[libvirt] [PATCH v3 19/20] Refactor qemuCapsParseDeviceStr to work from data tables

Jiri Denemark jdenemar at redhat.com
Thu Sep 27 11:29:42 UTC 2012


On Tue, Sep 25, 2012 at 19:00:12 +0100, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Currently the qemuCapsParseDeviceStr method has a bunch of open
> coded string searches/comparisons to detect devices and their
> properties. Soon this data will be obtained from QMP queries
> instead of -device help output. Maintaining the list of device
> and properties in two places is undesirable. Thus the existing
> qemuCapsParseDeviceStr() method needs to be refactored to
> separate the device types and properties from the actual
> search code.
> 
> Thus the -device help output is now parsed to construct a
> list of device names, and device properties. These are then
> checked against a set of datatables to set the capability
> flags
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c | 364 ++++++++++++++++++++++++++++++-------------
>  src/qemu/qemu_capabilities.h |   3 +-
>  tests/qemuhelptest.c         |   2 +-
>  3 files changed, 259 insertions(+), 110 deletions(-)
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 9c4f3be..c4d36f9 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -1233,6 +1233,262 @@ cleanup:
...
> +qemuCapsParseDeviceStrObjectTypes(const char *str,
> +                                  char ***types)
> +{
> +    const char *tmp = str;
> +    int ret = -1;
> +    size_t ntypelist = 0;
> +    char **typelist = NULL;
> +
> +    *types = NULL;
> +
> +    while ((tmp = strstr(tmp, OBJECT_TYPE_PREFIX))) {
> +        char *end;
> +        tmp += strlen(OBJECT_TYPE_PREFIX);
> +        end = strstr(tmp, "\"");
> +        if (!end) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Malformed QEMU device list string, missing quote"));
> +            goto cleanup;
> +        }
> +
> +        if (VIR_EXPAND_N(typelist, ntypelist, 1) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +        if (!(typelist[ntypelist-1] = strndup(tmp, end-tmp))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +
> +    *types = typelist;
> +    ret = ntypelist;
> +
> +cleanup:
> +    return ret;
> +}

typelist and all string referenced from it are leaked in case of error

> +
> +
> +static int
> +qemuCapsParseDeviceStrObjectProps(const char *str,
> +                                  const char *type,
> +                                  char ***props)
> +{
> +    const char *tmp = str;
> +    int ret = -1;
> +    size_t nproplist = 0;
> +    char **proplist = NULL;
> +
> +    VIR_DEBUG("Extract type %s", type);
> +    *props = NULL;
> +
> +    while ((tmp = strchr(tmp, '\n'))) {
> +        char *end;
> +        tmp += 1;
> +
> +        if (*tmp == '\0')
> +            break;
> +
> +        if (STRPREFIX(tmp, OBJECT_TYPE_PREFIX))
> +            continue;
> +
> +        if (!STRPREFIX(tmp, type))
> +            continue;
> +
> +        tmp += strlen(type);
> +        if (*tmp != '.')
> +            continue;
> +        tmp++;
> +
> +        end = strstr(tmp, "=");
> +        if (!end) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Malformed QEMU device list string, missing '='"));
> +            goto cleanup;
> +        }
> +        if (VIR_EXPAND_N(proplist, nproplist, 1) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +        if (!(proplist[nproplist-1] = strndup(tmp, end-tmp))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +
> +    *props = proplist;
> +    ret = nproplist;
> +
> +cleanup:
> +    return ret;
> +}

Similar memory leak on error path.

Jirka




More information about the libvir-list mailing list