From 53fa11d701ed4664d66eefa2dfe18d794c90881f Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 29 Jan 2016 09:52:04 -0800 Subject: [PATCH] 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 --- parse.c | 35 +++++++++++++++++++++++++++++++++++ parse.h | 2 ++ pkg.c | 23 ++++++++--------------- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/parse.c b/parse.c index b69f9fc..e46777e 100644 --- a/parse.c +++ b/parse.c @@ -1141,3 +1141,38 @@ parse_package_file (const char *path, gboolean ignore_requires, return pkg; } + +/* Parse a package variable mimicing parse_cflags/parse_libs() so that + * the output can be passed directly to a shell like --cflags/--libs. + */ +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 3169090..27c1fe6 100644 --- a/parse.h +++ b/parse.h @@ -28,6 +28,8 @@ Package *parse_package_file (const char *path, gboolean ignore_requires, 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 d0d3edf..c546d46 100644 --- a/pkg.c +++ b/pkg.c @@ -1034,40 +1034,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 -- 2.5.0