From 282a94d30180f6839b2f874e3716afdd3a09b3ae Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@collabora.com>
Date: Tue, 23 Mar 2021 15:16:55 +0000
Subject: [PATCH] system-info: Cope with non-UTF-8 library paths

JSON strings must be valid Unicode, so use the lossy transformation in
g_utf8_make_valid() to replace non-UTF-8 (if found) with
U+FFFD REPLACEMENT CHARACTER.

Signed-off-by: Simon McVittie <smcv@collabora.com>
---
 bin/system-info.c                         |  8 +++-----
 steam-runtime-tools/json-utils-internal.h |  4 ++++
 steam-runtime-tools/json-utils.c          | 15 +++++++++++++++
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/bin/system-info.c b/bin/system-info.c
index 11e49cf45..88e769928 100644
--- a/bin/system-info.c
+++ b/bin/system-info.c
@@ -287,11 +287,9 @@ print_libraries_details (JsonBuilder *builder,
           if (messages != NULL)
             _srt_json_builder_add_array_of_lines (builder, "messages", messages);
 
-          json_builder_set_member_name (builder, "soname");
-          json_builder_add_string_value (builder, soname);
-
-          json_builder_set_member_name (builder, "path");
-          json_builder_add_string_value (builder, srt_library_get_absolute_path (l->data));
+          _srt_json_builder_add_string_force_utf8 (builder, "soname", soname);
+          _srt_json_builder_add_string_force_utf8 (builder, "path",
+                                                   srt_library_get_absolute_path (l->data));
 
           if (srt_library_get_issues (l->data) != SRT_LIBRARY_ISSUES_NONE)
             {
diff --git a/steam-runtime-tools/json-utils-internal.h b/steam-runtime-tools/json-utils-internal.h
index 32dced706..fcc5f58b6 100644
--- a/steam-runtime-tools/json-utils-internal.h
+++ b/steam-runtime-tools/json-utils-internal.h
@@ -57,3 +57,7 @@ void _srt_json_builder_add_strv_value (JsonBuilder *builder,
 
 void _srt_json_builder_add_error_members (JsonBuilder *builder,
                                           const GError *error);
+
+void _srt_json_builder_add_string_force_utf8 (JsonBuilder *builder,
+                                              const char *key,
+                                              const char *value);
diff --git a/steam-runtime-tools/json-utils.c b/steam-runtime-tools/json-utils.c
index 09d7d6727..c9bdafe7f 100644
--- a/steam-runtime-tools/json-utils.c
+++ b/steam-runtime-tools/json-utils.c
@@ -322,3 +322,18 @@ _srt_json_builder_add_error_members (JsonBuilder *builder,
   json_builder_set_member_name (builder, "error");
   json_builder_add_string_value (builder, error->message);
 }
+
+void
+_srt_json_builder_add_string_force_utf8 (JsonBuilder *builder,
+                                         const char *key,
+                                         const char *value)
+{
+  g_autofree gchar *valid = NULL;
+
+  json_builder_set_member_name (builder, key);
+
+  if (value != NULL)
+    valid = g_utf8_make_valid (value, -1);
+
+  json_builder_add_string_value (builder, valid);
+}
-- 
GitLab