summaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
authorDan Nicholson <dbn.lists@gmail.com>2016-01-29 09:52:04 -0800
committerDan Nicholson <dbn.lists@gmail.com>2016-02-26 08:56:52 -0800
commit1c564a358303a8396dc71cc92d79bd0ac304b15c (patch)
tree684fccc480d3643ce8d3c4d33fea267a6485938a /parse.c
parente6d33fb1294266ff0302fcae23ef89e1d523910d (diff)
Only unquote --variable when it appears quoted
The change to unquote values in the --variable output broke users that had shell special characters in the variable. Instead, only unquote if the value starts with " or '. A larger fix to do a full unquote, split and escaping like --cflags/--libs is possible, but that might break the old semantics even further. Add a new function, parse_package_variable(), to handle that logic. https://bugs.freedesktop.org/show_bug.cgi?id=93284
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/parse.c b/parse.c
index 5596810..4da6702 100644
--- a/parse.c
+++ b/parse.c
@@ -1145,3 +1145,39 @@ parse_package_file (const char *key, const char *path,
return pkg;
}
+
+/* Parse a package variable. When the value appears to be quoted,
+ * unquote it so it can be more easily used in a shell. Otherwise,
+ * return the raw value.
+ */
+char *
+parse_package_variable (Package *pkg, const char *variable)
+{
+ char *value;
+ char *unquoted;
+ GError *error = NULL;
+
+ value = package_get_var (pkg, variable);
+ if (!value)
+ return NULL;
+
+ if (*value != '"' && *value != '\'')
+ /* Not quoted, return raw value */
+ return value;
+
+ /* Maybe too naive, but assume a fully quoted variable */
+ unquoted = g_shell_unquote (value, &error);
+ if (unquoted)
+ {
+ g_free (value);
+ return unquoted;
+ }
+ else
+ {
+ /* Note the issue, but just return the raw value */
+ debug_spew ("Couldn't unquote value of \"%s\": %s\n",
+ variable, error ? error->message : "unknown");
+ g_clear_error (&error);
+ return value;
+ }
+}