util: json: Don't remove the 'file' subobject when deflattening

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.
This commit is contained in:
Peter Krempa 2017-06-26 18:42:07 +02:00
parent de75de7c97
commit f43b7d60d8
2 changed files with 20 additions and 7 deletions

View File

@ -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;
}

View File

@ -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"),
NULLSTR(str));
goto cleanup;
}
}
if (!(drvname = virJSONValueObjectGetString(file, "driver"))) {