[libvirt] [PATCH 1/2] virjson: always raise vir error on append failures

Eric Blake eblake at redhat.com
Fri Jan 25 04:05:54 UTC 2019


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 at 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




More information about the libvir-list mailing list