From f5ee005a13cd0e6a87d870bf4db22d99863ad272 Mon Sep 17 00:00:00 2001 From: Ivana Atanasova Date: Thu, 18 Nov 2021 12:21:42 +0200 Subject: [PATCH] Update ngclient to skip visited nodes on delegation tree traversal This change edits the ngclient `Updater` to traverse the delegation tree on nodes, instead of edges in order to skip already visited nodes. For more detailed clarification, please review theupdateframework/specification#177 Fixes #1528 Signed-off-by: Ivana Atanasova --- tuf/ngclient/updater.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tuf/ngclient/updater.py b/tuf/ngclient/updater.py index fb651a2ad5..509125cf0d 100644 --- a/tuf/ngclient/updater.py +++ b/tuf/ngclient/updater.py @@ -62,7 +62,7 @@ import logging import os import tempfile -from typing import Optional, Set, Tuple +from typing import Optional, Set from urllib import parse from securesystemslib import util as sslib_util @@ -401,7 +401,7 @@ def _preorder_depth_first_walk( # List of delegations to be interrogated. A (role, parent role) pair # is needed to load and verify the delegated targets metadata. delegations_to_visit = [("targets", "root")] - visited_role_names: Set[Tuple[str, str]] = set() + visited_role_names: Set[str] = set() number_of_delegations = self.config.max_delegations # Preorder depth-first traversal of the graph of target delegations. @@ -409,9 +409,11 @@ def _preorder_depth_first_walk( # Pop the role name from the top of the stack. role_name, parent_role = delegations_to_visit.pop(-1) + if parent_role not in visited_role_names: + visited_role_names.add(parent_role) # Skip any visited current role to prevent cycles. - if (role_name, parent_role) in visited_role_names: + if role_name in visited_role_names: logger.debug("Skipping visited current role %s", role_name) continue @@ -427,7 +429,7 @@ def _preorder_depth_first_walk( return target # After preorder check, add current role to set of visited roles. - visited_role_names.add((role_name, parent_role)) + visited_role_names.add(role_name) # And also decrement number of visited roles. number_of_delegations -= 1