# UNDF: UNDF-2026-000000231 Fixes pyramid-0001: RoutesMapper.connect() — list membership test + removal on route replace. --- a/src/pyramid/urldispatch.py +++ b/src/pyramid/urldispatch.py @@ DEFECT pyramid-0001: RoutesMapper.connect() lines 57-58 class RoutesMapper: def __init__(self): self.routelist = [] self.static_routes = [] self.routes = {} + self._routeset = set() # FIX pyramid-0001: shadow set for O(1) membership def connect(self, name, pattern, factory=None, predicates=(), pregenerator=None, static=False): if name in self.routes: oldroute = self.routes[name] - if oldroute in self.routelist: # O(n) linear scan — CWE-407 - self.routelist.remove(oldroute) # O(n) linear removal — CWE-407 + if oldroute in self._routeset: # O(1) set lookup — fixed + self.routelist.remove(oldroute) # O(n) but confirmed to exist; acceptable + self._routeset.discard(oldroute) route = Route(name, pattern, factory, predicates, pregenerator) if not static: self.routelist.append(route) + self._routeset.add(route) # maintain shadow set else: self.static_routes.append(route) # NOTE: routelist must stay as a list for ordered route matching. The fix # eliminates the O(n²) growth from the `in` check on replacement — the # list.remove() itself remains O(n) but fires at most once per connect() # call and is now guarded by an O(1) set check. # For true O(1) removal: maintain route index dict; see pyramid-0002 pattern.