summaryrefslogtreecommitdiffstats
path: root/usr.sbin/portsnap
diff options
context:
space:
mode:
authorcperciva <cperciva@FreeBSD.org>2005-09-17 15:30:16 +0000
committercperciva <cperciva@FreeBSD.org>2005-09-17 15:30:16 +0000
commitc428222e35b08f0cc96b2691a9defbbb9bcc3dcc (patch)
tree6755ce47cafb023a40f4a6ddcf2387ff1ee5717b /usr.sbin/portsnap
parent33a8c892b7f8cd72d44da5f9e9586908ab377ac2 (diff)
downloadFreeBSD-src-c428222e35b08f0cc96b2691a9defbbb9bcc3dcc.zip
FreeBSD-src-c428222e35b08f0cc96b2691a9defbbb9bcc3dcc.tar.gz
Handle circular dependencies properly (via errx(3)) rather than dumping
core. This bug was made visible by a recent change to the audio/timidity++ port, which now has itself as a run dependency. Reported by: Emil Mikulic, Andreas Klemm
Diffstat (limited to 'usr.sbin/portsnap')
-rw-r--r--usr.sbin/portsnap/make_index/make_index.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/usr.sbin/portsnap/make_index/make_index.c b/usr.sbin/portsnap/make_index/make_index.c
index fbb8dd9..c02bba8 100644
--- a/usr.sbin/portsnap/make_index/make_index.c
+++ b/usr.sbin/portsnap/make_index/make_index.c
@@ -305,15 +305,28 @@ recurse_one(DEP * d, size_t * nd)
static void
recurse(PORT * p)
{
- if (p->recursed != 0)
+ switch (p->recursed) {
+ case 0:
+ /* First time we've seen this port */
+ p->recursed = 1;
+ break;
+ case 1:
+ /* We're in the middle of recursing this port */
+ errx(1, "Circular dependency loop found: %s"
+ " depends upon itself.\n", p->pkgname);
+ case 2:
+ /* This port has already been recursed */
return;
- p->recursed = 1;
+ }
p->edep = recurse_one(p->edep, &p->n_edep);
p->pdep = recurse_one(p->pdep, &p->n_pdep);
p->fdep = recurse_one(p->fdep, &p->n_fdep);
p->bdep = recurse_one(p->bdep, &p->n_bdep);
p->rdep = recurse_one(p->rdep, &p->n_rdep);
+
+ /* Finished recursing on this port */
+ p->recursed = 2;
}
/* Heapify an element in a package list */
OpenPOWER on IntegriCloud