summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
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:48:10 +0000
commit13c0ffc81c2eac94affbda04f2ca47298582a0bb (patch)
tree59dc17aec9541b0430833162a4d62fb5eab1b8bd /bitbake/lib
parente336017e87090767ce97dda7246b1a19be3ac23d (diff)
downloadpoky-13c0ffc81c2eac94affbda04f2ca47298582a0bb.tar.gz
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>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/toaster/orm/models.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
index 4f8510c4ec..b24e9c5492 100644
--- a/bitbake/lib/toaster/orm/models.py
+++ b/bitbake/lib/toaster/orm/models.py
@@ -1478,17 +1478,22 @@ class Layer_Version(models.Model):
1478 1478
1479 def get_alldeps(self, project_id): 1479 def get_alldeps(self, project_id):
1480 """Get full list of unique layer dependencies.""" 1480 """Get full list of unique layer dependencies."""
1481 def gen_layerdeps(lver, project): 1481 def gen_layerdeps(lver, project, depth):
1482 if depth == 0:
1483 return
1482 for ldep in lver.dependencies.all(): 1484 for ldep in lver.dependencies.all():
1483 yield ldep.depends_on 1485 yield ldep.depends_on
1484 # get next level of deps recursively calling gen_layerdeps 1486 # get next level of deps recursively calling gen_layerdeps
1485 for subdep in gen_layerdeps(ldep.depends_on, project): 1487 for subdep in gen_layerdeps(ldep.depends_on, project, depth-1):
1486 yield subdep 1488 yield subdep
1487 1489
1488 project = Project.objects.get(pk=project_id) 1490 project = Project.objects.get(pk=project_id)
1489 result = [] 1491 result = []
1490 projectlvers = [player.layercommit for player in project.projectlayer_set.all()] 1492 projectlvers = [player.layercommit for player in
1491 for dep in gen_layerdeps(self, project): 1493 project.projectlayer_set.all()]
1494 # protect against infinite layer dependency loops
1495 maxdepth = 20
1496 for dep in gen_layerdeps(self, project, maxdepth):
1492 # filter out duplicates and layers already belonging to the project 1497 # filter out duplicates and layers already belonging to the project
1493 if dep not in result + projectlvers: 1498 if dep not in result + projectlvers:
1494 result.append(dep) 1499 result.append(dep)