extensions-tool: Escape '\' and '"' in json string

If user-input string contains '\' and/or '"', extensions-tool
generates invalid json.
This fixes that by escaping '\' and '"'.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1279
This commit is contained in:
Koki Fukuda 2020-05-24 14:40:07 +09:00 committed by Florian Müllner
parent afb405782c
commit 390431c5e0

View File

@ -48,6 +48,23 @@ get_shell_version (GError **error)
return g_strjoinv (".", split_version);
}
static char *
escape_json_string (const char *string)
{
GString *escaped = g_string_new (string);
for (gsize i = 0; i < escaped->len; ++i)
{
if (escaped->str[i] == '"' || escaped->str[i] == '\\')
{
g_string_insert_c (escaped, i, '\\');
++i;
}
}
return g_string_free (escaped, FALSE);
}
static gboolean
create_metadata (GFile *target_dir,
const char *uuid,
@ -55,6 +72,9 @@ create_metadata (GFile *target_dir,
const char *description,
GError **error)
{
g_autofree char *uuid_escaped = NULL;
g_autofree char *name_escaped = NULL;
g_autofree char *desc_escaped = NULL;
g_autoptr (GFile) target = NULL;
g_autoptr (GString) json = NULL;
g_autofree char *version = NULL;
@ -63,11 +83,15 @@ create_metadata (GFile *target_dir,
if (version == NULL)
return FALSE;
uuid_escaped = escape_json_string (uuid);
name_escaped = escape_json_string (name);
desc_escaped = escape_json_string (description);
json = g_string_new ("{\n");
g_string_append_printf (json, " \"name\": \"%s\",\n", name);
g_string_append_printf (json, " \"description\": \"%s\",\n", description);
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid);
g_string_append_printf (json, " \"name\": \"%s\",\n", name_escaped);
g_string_append_printf (json, " \"description\": \"%s\",\n", desc_escaped);
g_string_append_printf (json, " \"uuid\": \"%s\",\n", uuid_escaped);
g_string_append_printf (json, " \"shell-version\": [\n");
g_string_append_printf (json, " \"%s\"\n", version);
g_string_append_printf (json, " ]\n}\n");