bitbake: 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]

(Bitbake rev: e9efef0bdb8068984c3013b87aac9e872ffb38ae)

Signed-off-by: David Reyna <David.Reyna@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Reyna, David 2016-11-24 11:19:56 +00:00 committed by Richard Purdie
parent e336017e87
commit 13c0ffc81c
1 changed files with 9 additions and 4 deletions

View File

@ -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)