From 06db3561dc80153ae0eda86faeaa9a99ef97b176 Mon Sep 17 00:00:00 2001 From: Eric Espie Date: Tue, 20 Dec 2022 14:26:44 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B04756=20-=20Ease=20extensibility=20for=20?= =?UTF-8?q?CRUD=20operations=20:=20Protect=20against=20update=20loops?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/cmdbabstract.class.inc.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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;