summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReyna, David <david.reyna@windriver.com>2016-11-24 11:19:56 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-11-30 15:47:46 +0000
commite9efef0bdb8068984c3013b87aac9e872ffb38ae (patch)
tree55de288176a0acfafd918444f98b45dec8561d1d
parentbc8401e78cea140349bded228d38f72f628b3980 (diff)
downloadbitbake-contrib-e9efef0bdb8068984c3013b87aac9e872ffb38ae.tar.gz
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 <David.Reyna@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/toaster/orm/models.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py
index 4f8510c4e..b24e9c549 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)