From 3aaf5bb342a0058d1f8832b173ec37aa11aea182 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 28 Aug 2024 15:54:14 -0400 Subject: [PATCH] Detect infinite loop condition while iterating terminations in CablePath.from_origin --- netbox/dcim/models/cables.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 2fac55dd4..358b75c29 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -1,4 +1,5 @@ import itertools +import logging from collections import defaultdict from django.contrib.contenttypes.fields import GenericForeignKey @@ -27,6 +28,8 @@ __all__ = ( 'CableTermination', ) +logger = logging.getLogger('netbox.dcim.cable') + trace_paths = Signal() @@ -543,6 +546,7 @@ class CablePath(models.Model): is_split = False while terminations: + prev_path = path.copy() # Terminations must all be of the same type assert all(isinstance(t, type(terminations[0])) for t in terminations[1:]) @@ -714,6 +718,14 @@ class CablePath(models.Model): is_split = True break + # Detect infinite loop in cabling topology + num_elements_added = len(path) - len(prev_path) + prev_elements_added = prev_path[-num_elements_added:] + elements_added = path[-num_elements_added:] + if elements_added == prev_elements_added: + logger.warning('Infinite loop detected while updating cable path trace') + break + return cls( path=path, is_complete=is_complete,