]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virJSONValueObjectAddVArgs: Allocate new object if passed pointer is NULL
authorPeter Krempa <pkrempa@redhat.com>
Tue, 9 Nov 2021 15:28:23 +0000 (16:28 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 17 Nov 2021 11:04:11 +0000 (12:04 +0100)
Until now the code would crash if virJSONValueObjectAdd is used without
a valid object. Adding the functionality of allocating it if it's NULL
will allow us to replace all uses of virJSONValueObjectCreate with this
single function.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/util/virjson.c

index bd71b849608f56e5d46d6698909a39c124467750..8b3599e94f3c7549f3aadf1207ee83509cacb651 100644 (file)
@@ -155,11 +155,15 @@ int
 virJSONValueObjectAddVArgs(virJSONValue **objptr,
                            va_list args)
 {
+    g_autoptr(virJSONValue) newobj = NULL;
     virJSONValue *obj = *objptr;
     char type;
     char *key;
     int rc;
 
+    if (obj == NULL)
+        newobj = obj = virJSONValueNewObject();
+
     while ((key = va_arg(args, char *)) != NULL) {
 
         if (strlen(key) < 3 || key[1] != ':') {
@@ -344,6 +348,9 @@ virJSONValueObjectAddVArgs(virJSONValue **objptr,
     if (virJSONValueObjectKeysNumber(obj) == 0)
         return 0;
 
+    if (newobj)
+        *objptr = g_steal_pointer(&newobj);
+
     return 1;
 }
 
@@ -366,17 +373,9 @@ int
 virJSONValueObjectCreateVArgs(virJSONValue **obj,
                               va_list args)
 {
-    int ret;
-
-    *obj = virJSONValueNewObject();
+    *obj = NULL;
 
-    /* free the object on error, or if no value objects were added */
-    if ((ret = virJSONValueObjectAddVArgs(obj, args)) <= 0) {
-        virJSONValueFree(*obj);
-        *obj = NULL;
-    }
-
-    return ret;
+    return virJSONValueObjectAddVArgs(obj, args);
 }