diff options
author | Dan Nicholson <dbn.lists@gmail.com> | 2016-01-29 09:52:04 -0800 |
---|---|---|
committer | Dan Nicholson <dbn.lists@gmail.com> | 2016-02-26 08:56:52 -0800 |
commit | 1c564a358303a8396dc71cc92d79bd0ac304b15c (patch) | |
tree | 684fccc480d3643ce8d3c4d33fea267a6485938a | |
parent | e6d33fb1294266ff0302fcae23ef89e1d523910d (diff) | |
download | pkg-config-1c564a358303a8396dc71cc92d79bd0ac304b15c.tar.gz |
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.c | 36 | ||||
-rw-r--r-- | parse.h | 2 | ||||
-rw-r--r-- | pkg.c | 23 |
3 files changed, 46 insertions, 15 deletions
@@ -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; + } +} @@ -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 @@ -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 |