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