diff options
author | Colin Percival <cperciva@FreeBSD.org> | 2005-09-17 15:30:16 +0000 |
---|---|---|
committer | Colin Percival <cperciva@FreeBSD.org> | 2005-09-17 15:30:16 +0000 |
commit | 6a15313d240a4db4dd30161a8205d29c980a9fb5 (patch) | |
tree | 6755ce47cafb023a40f4a6ddcf2387ff1ee5717b /usr.sbin | |
parent | 90412be1fd5a87d29094a88dca1780d7195eb7c6 (diff) | |
download | src-6a15313d240a4db4dd30161a8205d29c980a9fb5.tar.gz src-6a15313d240a4db4dd30161a8205d29c980a9fb5.zip |
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
Notes
Notes:
svn path=/head/; revision=150254
Diffstat (limited to 'usr.sbin')
-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 fbb8dd916864..c02bba8b0deb 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 */ |