From 80dbe647478da134d53f369678aa28bf27288352 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@collabora.com>
Date: Mon, 9 Nov 2020 17:40:16 +0000
Subject: [PATCH] json-utils: Don't critical if array_member exists but is not
 an array

Signed-off-by: Simon McVittie <smcv@collabora.com>
---
 steam-runtime-tools/json-utils.c | 8 ++++++--
 tests/json-utils.c               | 5 +++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/steam-runtime-tools/json-utils.c b/steam-runtime-tools/json-utils.c
index 6131c2f8f..1761d59c0 100644
--- a/steam-runtime-tools/json-utils.c
+++ b/steam-runtime-tools/json-utils.c
@@ -98,17 +98,21 @@ _srt_json_object_dup_strv_member (JsonObject *json_obj,
                                   const gchar *placeholder)
 {
   JsonArray *array;
+  JsonNode *arr_node;
   guint length;
   gchar **ret = NULL;
 
   g_return_val_if_fail (json_obj != NULL, NULL);
   g_return_val_if_fail (array_member != NULL, NULL);
 
-  if (json_object_has_member (json_obj, array_member))
+  arr_node = json_object_get_member (json_obj, array_member);
+
+  if (arr_node != NULL && JSON_NODE_HOLDS_ARRAY (arr_node))
     {
       guint j = 0;
 
-      array = json_object_get_array_member (json_obj, array_member);
+      array = json_node_get_array (arr_node);
+
       if (array == NULL)
         return ret;
 
diff --git a/tests/json-utils.c b/tests/json-utils.c
index 2cab98b0f..3bc22c9c4 100644
--- a/tests/json-utils.c
+++ b/tests/json-utils.c
@@ -66,6 +66,7 @@ test_dup_strv_member (Fixture *f,
   g_autoptr(JsonObject) obj = json_object_new ();
   g_autoptr(JsonObject) empty = json_object_new ();
   g_auto(GStrv) missing = NULL;
+  g_auto(GStrv) not_array = NULL;
   g_auto(GStrv) with_placeholder = NULL;
   g_auto(GStrv) without_placeholder = NULL;
 
@@ -75,10 +76,14 @@ test_dup_strv_member (Fixture *f,
   json_array_add_string_element (arr, "four");
   json_node_init_array (arr_node, arr);
   json_object_set_member (obj, "arr", g_steal_pointer (&arr_node));
+  json_object_set_double_member (obj, "not-array", 42.0);
 
   missing = _srt_json_object_dup_strv_member (obj, "missing", NULL);
   g_assert_null (missing);
 
+  not_array = _srt_json_object_dup_strv_member (obj, "not-array", NULL);
+  g_assert_null (not_array);
+
   with_placeholder = _srt_json_object_dup_strv_member (obj, "arr", "?!");
   g_assert_nonnull (with_placeholder);
   g_assert_cmpstr (with_placeholder[0], ==, "one");
-- 
GitLab