1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

virStorageSourceParseBackingJSON: Allow 'json:' pseudo URIs without 'file' wrapper

There are two possibilities:
1) json:{"file":{"driver":...}}
2) json:{"driver":...}

Our code didn't work properly with the second one as it was expecting
the 'file' wrapper. Conditionalize the removal to only the situation
when the top level doesn't have "driver".

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2020-02-03 14:07:35 +01:00
parent 7e13ff8dc0
commit f8e097570e

View File

@ -3521,10 +3521,17 @@ virStorageSourceParseBackingJSONRaw(virStorageSourcePtr src,
const char *jsonstr, const char *jsonstr,
int opaque G_GNUC_UNUSED) int opaque G_GNUC_UNUSED)
{ {
/* There are no interesting attributes in raw driver. virJSONValuePtr file;
* Treat it as pass-through.
*/ /* 'raw' is a format driver so it can have protocol driver children */
return virStorageSourceParseBackingJSONInternal(src, json, jsonstr); if (!(file = virJSONValueObjectGetObject(json, "file"))) {
virReportError(VIR_ERR_INVALID_ARG,
_("JSON backing volume definition '%s' lacks 'file' object"),
jsonstr);
return -1;
}
return virStorageSourceParseBackingJSONInternal(src, file, jsonstr);
} }
@ -3601,18 +3608,10 @@ virStorageSourceParseBackingJSONInternal(virStorageSourcePtr src,
virJSONValuePtr json, virJSONValuePtr json,
const char *jsonstr) const char *jsonstr)
{ {
virJSONValuePtr file;
const char *drvname; const char *drvname;
size_t i; size_t i;
if (!(file = virJSONValueObjectGetObject(json, "file"))) { if (!(drvname = virJSONValueObjectGetString(json, "driver"))) {
virReportError(VIR_ERR_INVALID_ARG,
_("JSON backing volume definition '%s' lacks 'file' object"),
jsonstr);
return -1;
}
if (!(drvname = virJSONValueObjectGetString(file, "driver"))) {
virReportError(VIR_ERR_INVALID_ARG, virReportError(VIR_ERR_INVALID_ARG,
_("JSON backing volume definition '%s' lacks driver name"), _("JSON backing volume definition '%s' lacks driver name"),
jsonstr); jsonstr);
@ -3621,7 +3620,7 @@ virStorageSourceParseBackingJSONInternal(virStorageSourcePtr src,
for (i = 0; i < G_N_ELEMENTS(jsonParsers); i++) { for (i = 0; i < G_N_ELEMENTS(jsonParsers); i++) {
if (STREQ(drvname, jsonParsers[i].drvname)) if (STREQ(drvname, jsonParsers[i].drvname))
return jsonParsers[i].func(src, file, jsonstr, jsonParsers[i].opaque); return jsonParsers[i].func(src, json, jsonstr, jsonParsers[i].opaque);
} }
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
@ -3637,6 +3636,7 @@ virStorageSourceParseBackingJSON(virStorageSourcePtr src,
{ {
g_autoptr(virJSONValue) root = NULL; g_autoptr(virJSONValue) root = NULL;
g_autoptr(virJSONValue) deflattened = NULL; g_autoptr(virJSONValue) deflattened = NULL;
virJSONValuePtr file = NULL;
if (!(root = virJSONValueFromString(json))) if (!(root = virJSONValueFromString(json)))
return -1; return -1;
@ -3644,7 +3644,18 @@ virStorageSourceParseBackingJSON(virStorageSourcePtr src,
if (!(deflattened = virJSONValueObjectDeflatten(root))) if (!(deflattened = virJSONValueObjectDeflatten(root)))
return -1; return -1;
return virStorageSourceParseBackingJSONInternal(src, deflattened, json); /* There are 2 possible syntaxes:
* 1) json:{"file":{"driver":...}}
* 2) json:{"driver":...}
* Remove the 'file' wrapper object in case 1.
*/
if (!virJSONValueObjectHasKey(deflattened, "driver"))
file = virJSONValueObjectGetObject(deflattened, "file");
if (!file)
file = deflattened;
return virStorageSourceParseBackingJSONInternal(src, file, json);
} }