diff options
author | Reyna, David <david.reyna@windriver.com> | 2016-11-24 11:19:56 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-11-30 15:48:10 +0000 |
commit | 13c0ffc81c2eac94affbda04f2ca47298582a0bb (patch) | |
tree | 59dc17aec9541b0430833162a4d62fb5eab1b8bd | |
parent | e336017e87090767ce97dda7246b1a19be3ac23d (diff) | |
download | poky-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>
-rw-r--r-- | bitbake/lib/toaster/orm/models.py | 13 |
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) |