From b46bb93cd1fe221dc4d6ff5e3ce99feda4ea31f1 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 14 Jun 2018 16:12:04 -0500 Subject: [PATCH] libpkgconf: tuple: properly dequote tuples when added from the parser (closes legacy github bug #186) --- libpkgconf/tuple.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libpkgconf/tuple.c b/libpkgconf/tuple.c index a4b4250..26dc5d5 100644 --- a/libpkgconf/tuple.c +++ b/libpkgconf/tuple.c @@ -136,6 +136,30 @@ pkgconf_tuple_find_delete(pkgconf_list_t *list, const char *key) } } +static char * +dequote(const char *value) +{ + char *buf = calloc(strlen(value) * 2, 1); + char *bptr = buf; + const char *i; + char quote = 0; + + for (i = value; *i != '\0'; i++) + { + if (!quote && (*i == '\'' || *i == '"')) + quote = *i; + else if (*i != quote) + *bptr++ = *i; + else if (*i == '\\' && *(i + 1) == quote) + { + i++; + *bptr++ = *i; + } + } + + return buf; +} + /* * !doc * @@ -154,20 +178,25 @@ pkgconf_tuple_find_delete(pkgconf_list_t *list, const char *key) pkgconf_tuple_t * pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key, const char *value, bool parse) { + char *dequote_value; pkgconf_tuple_t *tuple = calloc(sizeof(pkgconf_tuple_t), 1); pkgconf_tuple_find_delete(list, key); - PKGCONF_TRACE(client, "adding tuple to @%p: %s => %s (parsed? %d)", list, key, value, parse); + dequote_value = dequote(value); + + PKGCONF_TRACE(client, "adding tuple to @%p: %s => %s (parsed? %d)", list, key, dequote_value, parse); tuple->key = strdup(key); if (parse) - tuple->value = pkgconf_tuple_parse(client, list, value); + tuple->value = pkgconf_tuple_parse(client, list, dequote_value); else - tuple->value = strdup(value); + tuple->value = strdup(dequote_value); pkgconf_node_insert(&tuple->iter, tuple, list); + free(dequote_value); + return tuple; }