summaryrefslogtreecommitdiff
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
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
-rw-r--r--parse.c36
-rw-r--r--parse.h2
-rw-r--r--pkg.c23
3 files changed, 46 insertions, 15 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;
+ }
+}
diff --git a/parse.h b/parse.h
index 4ec84aa..db1bf86 100644
--- a/parse.h
+++ b/parse.h
@@ -29,6 +29,8 @@ Package *parse_package_file (const char *key, const char *path,
GList *parse_module_list (Package *pkg, const char *str, const char *path);
+char *parse_package_variable (Package *pkg, const char *variable);
+
#endif
diff --git a/pkg.c b/pkg.c
index cbe50d8..0d82c41 100644
--- a/pkg.c
+++ b/pkg.c
@@ -1070,40 +1070,33 @@ package_get_var (Package *pkg,
}
char *
-packages_get_var (GList *pkgs,
+packages_get_var (GList *pkgs,
const char *varname)
{
GList *tmp;
GString *str;
- char *retval;
-
- str = g_string_new ("");
-
+
+ str = g_string_new (NULL);
+
tmp = pkgs;
while (tmp != NULL)
{
Package *pkg = tmp->data;
char *var;
- var = package_get_var (pkg, varname);
-
+ var = parse_package_variable (pkg, varname);
if (var)
{
+ if (str->len > 0)
+ g_string_append_c (str, ' ');
g_string_append (str, var);
- g_string_append_c (str, ' ');
g_free (var);
}
tmp = g_list_next (tmp);
}
- /* chop last space */
- if (str->len > 0)
- str->str[str->len - 1] = '\0';
- retval = str->str;
- g_string_free (str, FALSE);
-
- return retval;
+ return g_string_free (str, FALSE);
}
int