]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: fix showing array of dictionary in JSON format
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 8 Aug 2023 02:24:22 +0000 (11:24 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 8 Aug 2023 08:33:16 +0000 (09:33 +0100)
This partially reverts the commit 684bce3d54463b3222246f72adfe82ad5d176fea
and fixes the issue introduced by it.

Fixes #28711.

src/busctl/busctl.c

index c1a0479015c126b7b87081085bdcfb8fa7fda115..f85db5fe142f98a293a857221587e509faa94d8f 100644 (file)
@@ -1735,12 +1735,15 @@ static int json_transform_variant(sd_bus_message *m, const char *contents, JsonV
 }
 
 static int json_transform_dict_array(sd_bus_message *m, JsonVariant **ret) {
-        _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+        JsonVariant **elements = NULL;
+        size_t n_elements = 0;
         int r;
 
         assert(m);
         assert(ret);
 
+        CLEANUP_ARRAY(elements, n_elements, json_variant_unref_many);
+
         for (;;) {
                 const char *contents;
                 char type;
@@ -1757,28 +1760,31 @@ static int json_transform_dict_array(sd_bus_message *m, JsonVariant **ret) {
 
                 assert(type == 'e');
 
+                if (!GREEDY_REALLOC(elements, n_elements + 2))
+                        return log_oom();
+
                 r = sd_bus_message_enter_container(m, type, contents);
                 if (r < 0)
                         return bus_log_parse_error(r);
 
-                r = json_transform_and_append(m, &array);
+                r = json_transform_one(m, elements + n_elements);
                 if (r < 0)
                         return r;
 
-                r = json_transform_and_append(m, &array);
+                n_elements++;
+
+                r = json_transform_one(m, elements + n_elements);
                 if (r < 0)
                         return r;
 
+                n_elements++;
+
                 r = sd_bus_message_exit_container(m);
                 if (r < 0)
                         return bus_log_parse_error(r);
         }
 
-        if (!array)
-                return json_variant_new_array(ret, NULL, 0);
-
-        *ret = TAKE_PTR(array);
-        return 0;
+        return json_variant_new_object(ret, elements, n_elements);
 }
 
 static int json_transform_one(sd_bus_message *m, JsonVariant **ret) {