A function that returns -1 for multiple possible failures, but only
raises a libvirt error for some of those failures, is hard to use
correctly. Yet both of our JSON object/array appenders fall in that
pattern. We should either use the _QUIET memory allocation variants,
and make callers decide to report failure; or we can make all failure
paths noisy. This patch takes the latter approach.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
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)
--
2.20.1