Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
fix(TB) prevent cf/relation resolving recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmhh committed May 5, 2022
1 parent 588476a commit 6dd3eba
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
7 changes: 6 additions & 1 deletion tine20/Tinebase/CustomField.php
Expand Up @@ -692,6 +692,8 @@ public function resolveMultipleCustomfields(Tinebase_Record_RecordSet $_records,
*/
protected function _resolveCustomFieldsValues(Tinebase_Record_RecordSet $_customFields, Tinebase_Record_RecordSet $_configs)
{
static $recursionIds = [];

/** @var Tinebase_Model_CustomField_Config $config */
foreach ($_configs as $config) {
$type = strtolower($config->definition->type);
Expand All @@ -716,13 +718,16 @@ protected function _resolveCustomFieldsValues(Tinebase_Record_RecordSet $_custom
}
$ids = $tmpIds;
}
$ids = array_unique($ids);

// prevent recursion
$ids = array_diff(array_unique($ids), $recursionIds);
if (count($ids) === 0) continue;
$current = $controller->resolveCustomfields(false);
try {
$recursionIds = array_merge($recursionIds, $ids);
$result = $controller->getMultiple($ids);
} finally {
$recursionIds = array_diff($recursionIds, $ids);
$controller->resolveCustomfields($current);
}

Expand Down
12 changes: 12 additions & 0 deletions tine20/Tinebase/Relations.php
Expand Up @@ -574,9 +574,19 @@ protected function _doCreateUpdateCheck($relation)
*/
protected function resolveAppRecords($_relations, $_ignoreACL = FALSE)
{
static $recursionIds = [];

$unsetIds = [];
$recursionRAII = new Tinebase_RAII(function() use (&$unsetIds, &$recursionIds) {
$recursionIds = array_diff($recursionIds, $unsetIds);
});

// separate relations by model
$modelMap = array();
foreach ($_relations as $relation) {
if (in_array($relation->getId(), $recursionIds)) continue;
$unsetIds[] = $relation->getId();
$recursionIds[] = $relation->getId();
if (!(isset($modelMap[$relation->related_model]) || array_key_exists($relation->related_model, $modelMap))) {
$modelMap[$relation->related_model] = new Tinebase_Record_RecordSet('Tinebase_Model_Relation');
}
Expand Down Expand Up @@ -649,6 +659,8 @@ protected function resolveAppRecords($_relations, $_ignoreACL = FALSE)
}
}
}

unset($recursionRAII);
}

/**
Expand Down

0 comments on commit 6dd3eba

Please sign in to comment.