From 4ea5a41e16f76358d2bdce194dce0ba9bc5f0261 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 24 Jan 2019 21:28:23 -0600 Subject: [PATCH] virjson: always raise vir error on append failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ján Tomko --- src/util/virjson.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/util/virjson.c b/src/util/virjson.c index 78f868a162..a028a0813a 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -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)