From 2daffcc768264a70c2a59bb1405f5a2635999150 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Fri, 29 Jan 2010 04:44:40 +0100 Subject: [PATCH] Avoid endless loop while sorting dependencies due to missing packages. --HG-- extra : convert_revision : xtraeme%40gmail.com-20100129034440-c1c9q0o5b0r1hhh2 --- lib/repository_findpkg.c | 8 ++++++++ lib/sortdeps.c | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/repository_findpkg.c b/lib/repository_findpkg.c index 0b458201..79ebefc9 100644 --- a/lib/repository_findpkg.c +++ b/lib/repository_findpkg.c @@ -205,6 +205,14 @@ xbps_repository_get_transaction_dict(void) * Sort package list if necessary. */ if ((rv = xbps_sort_pkg_deps(trans_dict)) != 0) { + /* + * If there are missing deps (errno==ENOENT) + * return the dictionary, the client should always + * check if that's the case. + */ + if (errno == ENOENT) + return trans_dict; + errno = rv; return NULL; } diff --git a/lib/sortdeps.c b/lib/sortdeps.c index 1c1dddef..25dad620 100644 --- a/lib/sortdeps.c +++ b/lib/sortdeps.c @@ -62,7 +62,7 @@ find_sorteddep_by_name(const char *pkgname) int HIDDEN xbps_sort_pkg_deps(prop_dictionary_t chaindeps) { - prop_array_t sorted, unsorted, rundeps; + prop_array_t sorted, unsorted, rundeps, missingdeps; prop_object_t obj, obj2; prop_object_iterator_t iter, iter2; struct sorted_dependency *sdep; @@ -73,6 +73,13 @@ xbps_sort_pkg_deps(prop_dictionary_t chaindeps) assert(chaindeps != NULL); + /* + * If there are missing dependencies, bail out. + */ + missingdeps = prop_dictionary_get(chaindeps, "missing_deps"); + if (prop_array_count(missingdeps) > 0) + return ENOENT; + sorted = prop_array_create(); if (sorted == NULL) return ENOMEM;