From 9fcd9687814f12770487d03dd0a61d42fc6ad693 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 6 Jun 2018 15:41:51 +0300 Subject: Merge with 1.4.2 upstream package version --- libpkgconf/fragment.c | 54 +++++++++++++++++++++++++++++++-------------------- libpkgconf/pkg.c | 33 ++++++++++++++++++++++++++----- 2 files changed, 61 insertions(+), 26 deletions(-) (limited to 'libpkgconf') diff --git a/libpkgconf/fragment.c b/libpkgconf/fragment.c index 1ea91ee..5b686f5 100644 --- a/libpkgconf/fragment.c +++ b/libpkgconf/fragment.c @@ -386,15 +386,19 @@ pkgconf_fragment_filter(const pkgconf_client_t *client, pkgconf_list_t *dest, pk } } -static inline bool -fragment_should_quote(const pkgconf_fragment_t *frag) +static inline char * +fragment_quote(const pkgconf_fragment_t *frag) { - const char *src; + const char *src = frag->data; + ssize_t outlen = strlen(src) + 10; + char *out, *dst; if (frag->data == NULL) - return false; + return NULL; + + out = dst = calloc(outlen, 1); - for (src = frag->data; *src; src++) + for (; *src; src++) { if (((*src < ' ') || (*src >= (' ' + (frag->merged ? 1 : 0)) && *src < '$') || @@ -406,10 +410,19 @@ fragment_should_quote(const pkgconf_fragment_t *frag) (*src == '`') || (*src > 'z' && *src < '~') || (*src > '~'))) - return true; + *dst++ = '\\'; + + *dst++ = *src; + + if ((ptrdiff_t)(dst - out) + 2 > outlen) + { + outlen *= 2; + out = realloc(out, outlen); + } } - return false; + *dst = 0; + return out; } static inline size_t @@ -422,10 +435,9 @@ pkgconf_fragment_len(const pkgconf_fragment_t *frag) if (frag->data != NULL) { - len += strlen(frag->data); - - if (fragment_should_quote(frag)) - len += 2; + char *quoted = fragment_quote(frag); + len += strlen(quoted); + free(quoted); } return len; @@ -462,13 +474,13 @@ fragment_render_buf(const pkgconf_list_t *list, char *buf, size_t buflen, bool e { const pkgconf_fragment_t *frag = node->data; size_t buf_remaining = buflen - (bptr - buf); - bool should_quote = fragment_should_quote(frag); + char *quoted = fragment_quote(frag); - if (pkgconf_fragment_len(frag) > buf_remaining) + if (strlen(quoted) > buf_remaining) + { + free(quoted); break; - - if (should_quote) - *bptr++ = '\''; + } if (frag->type) { @@ -476,11 +488,11 @@ fragment_render_buf(const pkgconf_list_t *list, char *buf, size_t buflen, bool e *bptr++ = frag->type; } - if (frag->data) - bptr += pkgconf_strlcpy(bptr, frag->data, buf_remaining); - - if (should_quote) - *bptr++ = '\''; + if (quoted != NULL) + { + bptr += pkgconf_strlcpy(bptr, quoted, buf_remaining); + free(quoted); + } *bptr++ = ' '; } diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c index 6918d6d..0feb4d6 100644 --- a/libpkgconf/pkg.c +++ b/libpkgconf/pkg.c @@ -884,15 +884,25 @@ static pkgconf_pkg_t pkg_config_virtual = { .flags = PKGCONF_PKG_PROPF_STATIC, .vars = { .head = &(pkgconf_node_t){ - .prev = NULL, - .next = NULL, + .next = &(pkgconf_node_t){ + .next = &(pkgconf_node_t){ + .data = &(pkgconf_tuple_t){ + .key = "pc_system_libdirs", + .value = SYSTEM_LIBDIR, + } + }, + .data = &(pkgconf_tuple_t){ + .key = "pc_system_includedirs", + .value = SYSTEM_INCLUDEDIR, + } + }, .data = &(pkgconf_tuple_t){ .key = "pc_path", .value = PKG_DEFAULT_PATH, }, }, .tail = NULL, - }, + } }; static pkgconf_pkg_t pkgconf_virtual = { @@ -904,8 +914,18 @@ static pkgconf_pkg_t pkgconf_virtual = { .flags = PKGCONF_PKG_PROPF_STATIC, .vars = { .head = &(pkgconf_node_t){ - .prev = NULL, - .next = NULL, + .next = &(pkgconf_node_t){ + .next = &(pkgconf_node_t){ + .data = &(pkgconf_tuple_t){ + .key = "pc_system_libdirs", + .value = SYSTEM_LIBDIR, + } + }, + .data = &(pkgconf_tuple_t){ + .key = "pc_system_includedirs", + .value = SYSTEM_INCLUDEDIR, + } + }, .data = &(pkgconf_tuple_t){ .key = "pc_path", .value = PKG_DEFAULT_PATH, @@ -1241,7 +1261,10 @@ pkgconf_pkg_scan_providers(pkgconf_client_t *client, pkgconf_dependency_t *pkgde pkg = pkgconf_scan_all(client, &ctx, (pkgconf_pkg_iteration_func_t) pkgconf_pkg_scan_provides_entry); if (pkg != NULL) + { + pkgdep->match = pkgconf_pkg_ref(client, pkg); return pkg; + } if (eflags != NULL) *eflags |= PKGCONF_PKG_ERRF_PACKAGE_NOT_FOUND; -- cgit v1.1