virjson: always raise vir error on append failures

A function that returns -1 for multiple possible failures, but only
raises a libvirt error for some of those failures, can be hard to
use correctly. Yet both of our JSON object/array appenders fall in
that pattern.  True, the silent errors represent coding bugs that
none of the callers should ever trigger, while the noisy errors
represent memory failures that can happen anywhere, so we happened
to never end up failing without an error. But it is better to
either use the _QUIET memory allocation variants, and make callers
decide to report failure; or make all failure paths noisy. This
patch takes the latter approach.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Eric Blake 2019-01-24 21:28:23 -06:00
parent 2707d4f8bc
commit 4ea5a41e16
1 changed files with 10 additions and 3 deletions

View File

@ -620,11 +620,16 @@ virJSONValueObjectAppend(virJSONValuePtr object,
{
char *newkey;
if (object->type != VIR_JSON_TYPE_OBJECT)
if (object->type != VIR_JSON_TYPE_OBJECT) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("expecting JSON object"));
return -1;
}
if (virJSONValueObjectHasKey(object, key))
if (virJSONValueObjectHasKey(object, key)) {
virReportError(VIR_ERR_INTERNAL_ERROR, _("duplicate key '%s'"), key);
return -1;
}
if (VIR_STRDUP(newkey, key) < 0)
return -1;
@ -774,8 +779,10 @@ int
virJSONValueArrayAppend(virJSONValuePtr array,
virJSONValuePtr value)
{
if (array->type != VIR_JSON_TYPE_ARRAY)
if (array->type != VIR_JSON_TYPE_ARRAY) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("expecting JSON array"));
return -1;
}
if (VIR_REALLOC_N(array->data.array.values,
array->data.array.nvalues + 1) < 0)