libpkgconf: tuple: properly dequote tuples when added from the parser (closes legacy github bug #186)

feature/tap-sh
William Pitcock 2018-06-14 16:12:04 -05:00
parent ae7faf73fd
commit b46bb93cd1
1 changed files with 32 additions and 3 deletions

View File

@ -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 * !doc
* *
@ -154,20 +178,25 @@ pkgconf_tuple_find_delete(pkgconf_list_t *list, const char *key)
pkgconf_tuple_t * pkgconf_tuple_t *
pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key, const char *value, bool parse) 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_t *tuple = calloc(sizeof(pkgconf_tuple_t), 1);
pkgconf_tuple_find_delete(list, key); 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); tuple->key = strdup(key);
if (parse) if (parse)
tuple->value = pkgconf_tuple_parse(client, list, value); tuple->value = pkgconf_tuple_parse(client, list, dequote_value);
else else
tuple->value = strdup(value); tuple->value = strdup(dequote_value);
pkgconf_node_insert(&tuple->iter, tuple, list); pkgconf_node_insert(&tuple->iter, tuple, list);
free(dequote_value);
return tuple; return tuple;
} }