From: Reyna, David Date: Thu, 24 Nov 2016 11:19:56 +0000 (+0000) Subject: toaster: orm gen_layerdeps Protect against circular Layer dependencies X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e9efef0bdb8068984c3013b87aac9e872ffb38ae;p=thirdparty%2Fopenembedded%2Fopenembedded-core-contrib.git toaster: orm gen_layerdeps Protect against circular Layer dependencies Limit the recursion (to say 20 levels) when processing layer dependencies so that circular dependecies do not cause infinite decent and an out-of-memory failure. The duplicate found layers are already immediately filtered in the code. [YOCTO #10630] Signed-off-by: David Reyna Signed-off-by: Richard Purdie --- diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py index 4f8510c4ec9..b24e9c5492b 100644 --- a/lib/toaster/orm/models.py +++ b/lib/toaster/orm/models.py @@ -1478,17 +1478,22 @@ class Layer_Version(models.Model): def get_alldeps(self, project_id): """Get full list of unique layer dependencies.""" - def gen_layerdeps(lver, project): + def gen_layerdeps(lver, project, depth): + if depth == 0: + return for ldep in lver.dependencies.all(): yield ldep.depends_on # get next level of deps recursively calling gen_layerdeps - for subdep in gen_layerdeps(ldep.depends_on, project): + for subdep in gen_layerdeps(ldep.depends_on, project, depth-1): yield subdep project = Project.objects.get(pk=project_id) result = [] - projectlvers = [player.layercommit for player in project.projectlayer_set.all()] - for dep in gen_layerdeps(self, project): + projectlvers = [player.layercommit for player in + project.projectlayer_set.all()] + # protect against infinite layer dependency loops + maxdepth = 20 + for dep in gen_layerdeps(self, project, maxdepth): # filter out duplicates and layers already belonging to the project if dep not in result + projectlvers: result.append(dep)