lib/plist_find.c: fix false positive detecting vpkgs.

If target pkg was matched via xbps_pkg_version(), it was
incorrectly accessing the first vpkg stored.
This commit is contained in:
Juan RP 2020-02-24 10:22:52 +01:00
parent cc601e1e91
commit 77c72f9c2c
No known key found for this signature in database
GPG Key ID: AF19F6CB482F9368

View File

@ -50,14 +50,12 @@ get_pkg_in_array(xbps_array_t array, const char *str, xbps_trans_type_t tt, bool
return NULL; return NULL;
while ((obj = xbps_object_iterator_next(iter))) { while ((obj = xbps_object_iterator_next(iter))) {
const char *pkgver = NULL, *pkgname = NULL; const char *pkgver = NULL;
char pkgname[XBPS_NAME_SIZE] = {0};
if (!xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver)) { if (!xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver)) {
continue; continue;
} }
if (!xbps_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname)) {
break;
}
if (virtual) { if (virtual) {
/* /*
* Check if package pattern matches * Check if package pattern matches
@ -79,6 +77,9 @@ get_pkg_in_array(xbps_array_t array, const char *str, xbps_trans_type_t tt, bool
break; break;
} }
} else { } else {
if (!xbps_pkg_name(pkgname, sizeof(pkgname), pkgver)) {
abort();
}
/* match by pkgname */ /* match by pkgname */
if (strcmp(pkgname, str) == 0) { if (strcmp(pkgname, str) == 0) {
found = true; found = true;
@ -215,48 +216,54 @@ vpkg_user_conf(struct xbps_handle *xhp, const char *vpkg, bool only_conf)
while ((obj = xbps_object_iterator_next(iter))) { while ((obj = xbps_object_iterator_next(iter))) {
xbps_string_t rpkg; xbps_string_t rpkg;
char buf[XBPS_NAME_SIZE] = {0}; char buf[XBPS_NAME_SIZE] = {0};
char *vpkgver = NULL; char *vpkgver = NULL, *vpkgname = NULL;
const char *vpkgname = NULL, *vpkg_conf = NULL; const char *vpkg_conf = NULL;
vpkg_conf = xbps_dictionary_keysym_cstring_nocopy(obj); vpkg_conf = xbps_dictionary_keysym_cstring_nocopy(obj);
rpkg = xbps_dictionary_get_keysym(xhp->vpkgd, obj); rpkg = xbps_dictionary_get_keysym(xhp->vpkgd, obj);
pkg = xbps_string_cstring_nocopy(rpkg); pkg = xbps_string_cstring_nocopy(rpkg);
if (xbps_pkg_version(vpkg_conf)) { if (xbps_pkg_version(vpkg_conf)) {
if (!xbps_pkg_name(buf, XBPS_NAME_SIZE, vpkg_conf)) { if (!xbps_pkg_name(buf, sizeof(buf), vpkg_conf)) {
abort(); abort();
} }
vpkgname = buf; vpkgname = strdup(buf);
} else { } else {
vpkgname = vpkg_conf; vpkgname = strdup(vpkg_conf);
} }
assert(vpkgname); assert(vpkgname);
if (xbps_pkgpattern_version(vpkg)) { if (xbps_pkgpattern_version(vpkg)) {
if (xbps_pkg_version(vpkg_conf)) { if (xbps_pkg_version(vpkg_conf)) {
if (!xbps_pkgpattern_match(vpkg_conf, vpkg)) { if (!xbps_pkgpattern_match(vpkg_conf, vpkg)) {
free(vpkgname);
continue; continue;
} }
} else { } else {
vpkgver = xbps_xasprintf("%s-999999_1", vpkg_conf); vpkgver = xbps_xasprintf("%s-999999_1", vpkg_conf);
if (!xbps_pkgpattern_match(vpkgver, vpkg)) { if (!xbps_pkgpattern_match(vpkgver, vpkg)) {
free(vpkgver); free(vpkgver);
free(vpkgname);
continue; continue;
} }
free(vpkgver); free(vpkgver);
} }
} else if (xbps_pkg_version(vpkg)) { } else if (xbps_pkg_version(vpkg)) {
if (!xbps_pkg_name(buf, XBPS_NAME_SIZE, vpkg)) { if (!xbps_pkg_name(buf, sizeof(buf), vpkg)) {
abort(); abort();
} }
if (strcmp(buf, vpkgname)) { if (strcmp(buf, vpkgname)) {
free(vpkgname);
continue; continue;
} }
} else { } else {
if (strcmp(vpkg, vpkgname)) { if (strcmp(vpkg, vpkgname)) {
free(vpkgname);
continue; continue;
} }
} }
xbps_dbg_printf(xhp, "%s: vpkg_conf %s pkg %s vpkgname %s\n", __func__, vpkg_conf, pkg, vpkgname);
free(vpkgname);
found = true; found = true;
break; break;
} }