diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index f0b9e11f4..5c7c1a62d 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -183,6 +183,10 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay /** @var array initial attributes flags cache [attcode]['flags'] */ protected $aInitialAttributesFlags; + protected $iUpdateLoopCount; + + const MAX_UPDATE_LOOP_COUNT = 10; + /** * Constructor from a row of data (as a hash 'attcode' => value) @@ -200,6 +204,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay $this->sDisplayMode = static::DEFAULT_DISPLAY_MODE; $this->bAllowWrite = false; $this->bAllowDelete = false; + $this->iUpdateLoopCount = 0; } /** @@ -4436,7 +4441,19 @@ HTML; } if ($this->IsModified()) { - return $this->DBUpdate(); + $this->iUpdateLoopCount++; + if ($this->iUpdateLoopCount > self::MAX_UPDATE_LOOP_COUNT) { + $sClass = get_class($this); + $sKey = $this->GetKey(); + $aPlugins = []; + foreach (MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance) { + $aPlugins[] = get_class($oExtensionInstance); + } + $sPlugins = implode(', ', $aPlugins); + IssueLog::Error("CRUD: DBUpdate $sClass::$sKey Update loop detected plugins: $sPlugins", LogChannels::DM_CRUD); + } else { + return $this->DBUpdate(); + } } return $res;