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:47:46 +0000 |
commit | e9efef0bdb8068984c3013b87aac9e872ffb38ae (patch) | |
tree | 55de288176a0acfafd918444f98b45dec8561d1d /lib | |
parent | bc8401e78cea140349bded228d38f72f628b3980 (diff) | |
download | bitbake-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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/toaster/orm/models.py | 13 |
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) |