commit: f3ce28b07839e478051947ae7f04bc4b798c1345
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sat Jun 12 15:37:46 2021 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sat Jun 12 15:37:46 2021 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=f3ce28b0
libq/tree: avoid crash in tree_close_pkg on virtuals
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/tree.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libq/tree.c b/libq/tree.c
index 2180867..39beac8 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -1221,7 +1221,7 @@ tree_pkg_meta_get_int(tree_pkg_ctx *pkg_ctx, size_t
offset, const char *keyn)
ctx->cachetype = CACHE_PACKAGES;
if (pkg_ctx->meta == NULL) {
/* hrmffff. */
- pkg_ctx->fd = 0;
+ pkg_ctx->fd = -2;
pkg_ctx->meta = tree_pkg_read(pkg_ctx);
}
key = (char **)((char *)&pkg_ctx->meta->Q__data +
offset);
@@ -1324,7 +1324,7 @@ tree_close_metadata(tree_metadata_xml *meta_ctx)
void
tree_close_pkg(tree_pkg_ctx *pkg_ctx)
{
- if (pkg_ctx->fd != -1)
+ if (pkg_ctx->fd >= 0)
close(pkg_ctx->fd);
if (pkg_ctx->atom != NULL)
atom_implode(pkg_ctx->atom);
@@ -1424,7 +1424,7 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb
callback, void *priv)
pkg.repo = ctx->repo;
pkg.atom = atom;
pkg.cat_ctx = cat;
- pkg.fd = 0; /* intentional, meta has already
been read */
+ pkg.fd = -2; /* intentional, meta has already
been read */
/* do call callback with pkg_atom (populate cat
and pkg) */
ret |= callback(&pkg, priv);
@@ -1690,7 +1690,8 @@ tree_match_atom_cache_populate_cb(tree_pkg_ctx *ctx, void
*priv)
if (meta != NULL) {
pkg->meta = xmalloc(sizeof(*pkg->meta));
memcpy(pkg->meta, meta, sizeof(*pkg->meta));
- pkg->fd = 0; /* don't try to read, we already got it */
+ pkg->meta->Q__data = NULL; /* avoid free here */
+ pkg->fd = -2; /* don't try to read, we already got it */
} else {
pkg->meta = NULL;
}