[libvirt] [PATCH 4/9] util: json: Don't remove the 'file' subobject when deflattening

John Ferlan jferlan at redhat.com
Mon Jul 10 12:10:37 UTC 2017



On 06/27/2017 08:46 AM, Peter Krempa wrote:
> Currently the function would deflatten the object by dropping the 'file'
> prefix from the attributes. This does not really scale well or adhere to
> the documentation.
> 
> Until we refactor the worker to properly deflatten everything we at
> least simulate it by adding the "file" wrapper object back.
> ---
>  src/util/virjson.c        | 19 +++++++++++++------
>  src/util/virstoragefile.c |  8 +++++++-
>  2 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/src/util/virjson.c b/src/util/virjson.c
> index 8ab542432..a8e28cd1b 100644
> --- a/src/util/virjson.c
> +++ b/src/util/virjson.c
> @@ -2012,17 +2012,24 @@ virJSONValueObjectDeflattenWorker(const char *key,
>  virJSONValuePtr
>  virJSONValueObjectDeflatten(virJSONValuePtr json)
>  {
> -    virJSONValuePtr ret;
> +    virJSONValuePtr deflattened;
> +    virJSONValuePtr ret = NULL;
> 
> -    if (!(ret = virJSONValueNewObject()))
> +    if (!(deflattened = virJSONValueNewObject()))
>          return NULL;
> 
>      if (virJSONValueObjectForeachKeyValue(json,
>                                            virJSONValueObjectDeflattenWorker,
> -                                          ret) < 0) {
> -        virJSONValueFree(ret);
> -        return NULL;
> -    }
> +                                          deflattened) < 0)
> +        goto cleanup;
> +
> +    if (virJSONValueObjectCreate(&ret, "a:file", deflattened, NULL) < 0)
> +        goto cleanup;
> +
> +    deflattened = NULL;
> +
> + cleanup:
> +    virJSONValueFree(deflattened);
> 
>      return ret;
>  }
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 52c5301ff..d24502fbf 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -3260,7 +3260,13 @@ virStorageSourceParseBackingJSONInternal(virStorageSourcePtr src,
>          if (!(fixedroot = virJSONValueObjectDeflatten(json)))
>              goto cleanup;
> 
> -        file = fixedroot;
> +        if (!(file = virJSONValueObjectGetObject(fixedroot, "file"))) {
> +            str = virJSONValueToString(json, false);
> +            virReportError(VIR_ERR_INVALID_ARG,
> +                _("JSON backing volume defintion '%s' lacks 'file' object"),
> +                str);

Not aligned properly under VIR_ERR_INVALID_ARG

Similar to driver below, this should be NULLSTR(str);

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

> +            goto cleanup;
> +        }
>      }
> 
>      if (!(drvname = virJSONValueObjectGetString(file, "driver"))) {
> 




More information about the libvir-list mailing list