Actions
Bug #88118
closedLoose reference while remove items from a tree based on a callback in PageTreeRepository
Status:
Closed
Priority:
Must have
Assignee:
-
Category:
Authentication
Target version:
-
Start date:
2019-04-09
Due date:
% Done:
0%
Estimated time:
TYPO3 Version:
9
PHP Version:
7.2
Tags:
Complexity:
Is Regression:
Sprint Focus:
Description
Hook "$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauthgroup.php']['calcPerms']" in BackendUserAuthentication has no effect.
The bug is in PageTreeRepository::applyCallbackToChildren in line 145:
/**
* Removes items from a tree based on a callback, usually used for permission checks
*
* @param array $tree
* @param callable $callback
*/
protected function applyCallbackToChildren(array &$tree, callable $callback)
{
if (!isset($tree['_children'])) {
return;
}
foreach ($tree['_children'] as $k => $childPage) {
if (!call_user_func_array($callback, [$childPage])) {
unset($tree['_children'][$k]);
continue;
}
$this->applyCallbackToChildren($childPage, $callback);
}
}
The unset does not effect on _children array, because the iteration ignores the reference.
The solution to set reference for $childPage:
foreach ($tree['_children'] as $k => &$childPage) {
...
}
Actions