From 1b94b6e76b3657a2635be97fd79d269635ca67a5 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@collabora.com>
Date: Mon, 9 Nov 2020 16:41:12 +0000
Subject: [PATCH] json-utils: Add control over the placeholder for non-string
 items in strv

Signed-off-by: Simon McVittie <smcv@collabora.com>
---
 steam-runtime-tools/json-utils-internal.h |  3 ++-
 steam-runtime-tools/json-utils.c          | 25 ++++++++++++++++-------
 steam-runtime-tools/system-info.c         | 12 ++++++++---
 3 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/steam-runtime-tools/json-utils-internal.h b/steam-runtime-tools/json-utils-internal.h
index b3e1d208d..c7e0a6793 100644
--- a/steam-runtime-tools/json-utils-internal.h
+++ b/steam-runtime-tools/json-utils-internal.h
@@ -41,4 +41,5 @@ guint srt_get_flags_from_json_array (GType flags_type,
                                      guint flag_if_unknown);
 
 gchar ** _srt_json_object_dup_strv_member (JsonObject *json_obj,
-                                           const gchar *array_member);
+                                           const gchar *array_member,
+                                           const gchar *placeholder);
diff --git a/steam-runtime-tools/json-utils.c b/steam-runtime-tools/json-utils.c
index 422d2456e..160d44582 100644
--- a/steam-runtime-tools/json-utils.c
+++ b/steam-runtime-tools/json-utils.c
@@ -84,9 +84,9 @@ out:
  * @json_obj: (not nullable): A JSON Object used to search for
  *  @array_member property
  * @array_member: (not nullable): The JSON member to look up
- *
- * Every %NULL or non string members of the array are replaced with the value
- * "<invalid>".
+ * @placeholder: (nullable): If an item in the array is not a string,
+ *  substitute this non-%NULL value; or if %NULL, behave as though it
+ *  was not present
  *
  * Returns: (transfer full) (array zero-terminated=1) (element-type utf8) (nullable):
  *  A string array from the given @json_obj, or %NULL if it doesn't have a
@@ -94,7 +94,8 @@ out:
  */
 gchar **
 _srt_json_object_dup_strv_member (JsonObject *json_obj,
-                                  const gchar *array_member)
+                                  const gchar *array_member,
+                                  const gchar *placeholder)
 {
   JsonArray *array;
   guint length;
@@ -106,20 +107,30 @@ _srt_json_object_dup_strv_member (JsonObject *json_obj,
 
   if (json_object_has_member (json_obj, array_member))
     {
+      guint j = 0;
+
       array = json_object_get_array_member (json_obj, array_member);
       if (array == NULL)
         return ret;
 
       length = json_array_get_length (array);
       ret = g_new0 (gchar *, length + 1);
+
       for (guint i = 0; i < length; i++)
         {
           element = json_array_get_string_element (array, i);
+
           if (element == NULL)
-            element = "<invalid>";
-          ret[i] = g_strdup (element);
+            element = placeholder;
+
+          if (element == NULL)
+            continue;
+
+          ret[j++] = g_strdup (element);
         }
-      ret[length] = NULL;
+
+      g_assert (j <= length);
+      ret[j] = NULL;
     }
 
   return ret;
diff --git a/steam-runtime-tools/system-info.c b/steam-runtime-tools/system-info.c
index 83121dfd3..2928a68e0 100644
--- a/steam-runtime-tools/system-info.c
+++ b/steam-runtime-tools/system-info.c
@@ -1349,9 +1349,13 @@ _srt_system_info_get_pinned_libs_from_report (JsonObject *json_obj,
     {
       json_pinned_obj = json_object_get_object_member (json_obj, which);
 
-      pinned_list = _srt_json_object_dup_strv_member (json_pinned_obj, "list");
+      pinned_list = _srt_json_object_dup_strv_member (json_pinned_obj,
+                                                      "list",
+                                                      "<invalid>");
 
-      *messages = _srt_json_object_dup_strv_member (json_pinned_obj, "messages");
+      *messages = _srt_json_object_dup_strv_member (json_pinned_obj,
+                                                    "messages",
+                                                    "<invalid>");
     }
 
   return pinned_list;
@@ -3232,7 +3236,9 @@ srt_system_info_list_driver_environment (SrtSystemInfo *self)
 static gchar **
 _srt_system_info_driver_environment_from_report (JsonObject *json_obj)
 {
-  return _srt_json_object_dup_strv_member (json_obj, "driver_environment");
+  return _srt_json_object_dup_strv_member (json_obj,
+                                           "driver_environment",
+                                           "<invalid>");
 }
 
 typedef struct
-- 
GitLab