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:
parent
e336017e87
commit
13c0ffc81c
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue