Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add PKG_FLAG_UPGRADE_VULNERABLE flag for pkg upgrade
Vsevolod Stakhov committed 9 years ago
commit 364fbb60c10f180a3c1e705cece8b2cf75b99286
parent c869e86
2 files changed +18 -2
modified libpkg/pkg.h.in
@@ -5,6 +5,7 @@
 * Copyright (c) 2011 Philippe Pepiot <phil@philpep.org>
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
 * Copyright (c) 2013-2014 Matthew Seaman <matthew@FreeBSD.org>
+
 * Copyright (c) 2014-2016 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
@@ -370,7 +371,8 @@ typedef enum _pkg_flags {
	PKG_FLAG_FORCE_MISSING = (1U << 9),
	PKG_FLAG_FETCH_MIRROR = (1U << 10),
	PKG_FLAG_USE_IPV4 = (1U << 11),
-
	PKG_FLAG_USE_IPV6 = (1U << 12)
+
	PKG_FLAG_USE_IPV6 = (1U << 12),
+
	PKG_FLAG_UPGRADE_VULNERABLE = (1U << 13)
} pkg_flags;

typedef enum _pkg_stats_t {
modified libpkg/pkg_jobs.c
@@ -753,6 +753,7 @@ pkg_jobs_process_remote_pkg(struct pkg_jobs *j, struct pkg *rp,
	struct pkg_job_universe_item *nit;
	struct pkg_job_request_item *nrit = NULL;
	struct pkg *lp = NULL;
+
	struct pkg_dep *rdep = NULL;

	if (rp->digest == NULL) {
		if (pkg_checksum_calculate(rp, j->db) != EPKG_OK) {
@@ -766,12 +767,25 @@ pkg_jobs_process_remote_pkg(struct pkg_jobs *j, struct pkg *rp,
	}

	nit = pkg_jobs_universe_get_upgrade_candidates(j->universe, rp->uid, lp,
-
		j->flags & PKG_FLAG_FORCE, with_version != 0 ? rp->version : NULL);
+
		j->flags & (PKG_FLAG_FORCE|PKG_FLAG_UPGRADE_VULNERABLE),
+
		with_version != 0 ? rp->version : NULL);

	if (nit != NULL) {
		nrit = pkg_jobs_add_req_from_universe(&j->request_add, nit, false, false);
+

		if (req != NULL)
			*req = nrit;
+

+
		if (j->flags & PKG_FLAG_UPGRADE_VULNERABLE) {
+
			/* Also process all rdeps recursively */
+
			while (pkg_rdeps(nrit->pkg, &rdep) == EPKG_OK) {
+
				lp = pkg_jobs_universe_get_local(j->universe, rdep->uid, 0);
+

+
				if (lp) {
+
					(void)pkg_jobs_process_remote_pkg(j, lp, NULL, 0);
+
				}
+
			}
+
		}
	}

	if (nrit == NULL && lp)