diff options
author | cperciva <cperciva@FreeBSD.org> | 2005-09-17 15:30:16 +0000 |
---|---|---|
committer | cperciva <cperciva@FreeBSD.org> | 2005-09-17 15:30:16 +0000 |
commit | c428222e35b08f0cc96b2691a9defbbb9bcc3dcc (patch) | |
tree | 6755ce47cafb023a40f4a6ddcf2387ff1ee5717b | |
parent | 33a8c892b7f8cd72d44da5f9e9586908ab377ac2 (diff) | |
download | FreeBSD-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
-rw-r--r-- | usr.sbin/portsnap/make_index/make_index.c | 17 |
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 */ |