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):
|
def get_alldeps(self, project_id):
|
||||||
"""Get full list of unique layer dependencies."""
|
"""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():
|
for ldep in lver.dependencies.all():
|
||||||
yield ldep.depends_on
|
yield ldep.depends_on
|
||||||
# get next level of deps recursively calling gen_layerdeps
|
# 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
|
yield subdep
|
||||||
|
|
||||||
project = Project.objects.get(pk=project_id)
|
project = Project.objects.get(pk=project_id)
|
||||||
result = []
|
result = []
|
||||||
projectlvers = [player.layercommit for player in project.projectlayer_set.all()]
|
projectlvers = [player.layercommit for player in
|
||||||
for dep in gen_layerdeps(self, project):
|
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
|
# filter out duplicates and layers already belonging to the project
|
||||||
if dep not in result + projectlvers:
|
if dep not in result + projectlvers:
|
||||||
result.append(dep)
|
result.append(dep)
|
||||||
|
|
Loading…
Reference in New Issue