Whilst working towards Joomla 5 compatibility of our extensions we found out that the removal of \Joomla\CMS\Object\CMSObject
from the inheritance path of \Joomla\CMS\Table\Table
has unintended consequences in at least two places:
\Joomla\CMS\Form\Form::bindLevel
can experience an infinite recursion if the Table object has a private or protected property which references itself, or the table object. We observed it at least once with the database object (_db
) having a non-null sql
property which, of course, has a reference back to the database object, thus causing an infinite loop. Please see below for an explanation.\Joomla\CMS\Serializer\JoomlaSerializer::getAttributes
returns all properties (public, protected, and private). By itself not a problem, since they are by default filtered by $fieldsToRenderList
/ $fieldsToRenderItem
, but could be an issue on API views which assume that Joomla returns only the public properties of an object. This change in behaviour can lead to security issues, i.e. the disclosure of privileged information such as the database access information of the site.The debug backtrace of our observation of the first problem is as follows:
#0 /var/www/joomla5/libraries/src/Form/Form.php(1381): explode('.', '\x00*\x00_db.\x00*\x00sql.\x00...')
#1 /var/www/joomla5/libraries/src/Form/Form.php(1219): Joomla\CMS\Form\Form->findGroup('\x00*\x00_db.\x00*\x00sql.\x00...')
#2 /var/www/joomla5/libraries/src/Form/Form.php(177): Joomla\CMS\Form\Form->findField(':context', '\x00*\x00_db.\x00*\x00sql.\x00...')
#3 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#4 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#5 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#6 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#7 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#8 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#9 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#10 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#11 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#12 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#13 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#14 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#15 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#16 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#17 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#18 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#19 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#20 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#21 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#22 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#23 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#24 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#25 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#26 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#27 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#28 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#29 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#30 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#31 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#32 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#33 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#34 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#35 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#36 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#37 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#38 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#39 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#40 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#41 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#42 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#43 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#44 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#45 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#46 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#47 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#48 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#49 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#50 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#51 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#52 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#53 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#54 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#55 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#56 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#57 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#58 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#59 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#60 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#61 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#62 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#63 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#64 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#65 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#66 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#67 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#68 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#69 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#70 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#71 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#72 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#73 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#74 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#75 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#76 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#77 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#78 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#79 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#80 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#81 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#82 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#83 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#84 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#85 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#86 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#87 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#88 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#89 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#90 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#91 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#92 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#93 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#94 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#95 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#96 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#97 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#98 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#99 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#100 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#101 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#102 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#103 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#104 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#105 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#106 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#107 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#108 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#109 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#110 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#111 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#112 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#113 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#114 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#115 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#116 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#117 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#118 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#119 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#120 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#121 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#122 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#123 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#124 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#125 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#126 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#127 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#128 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#129 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#130 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#131 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#132 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#133 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#134 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#135 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#136 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#137 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#138 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#139 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#140 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#141 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#142 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#143 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#144 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#145 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#146 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#147 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#148 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#149 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#150 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#151 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#152 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#153 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#154 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#155 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#156 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#157 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#158 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#159 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#160 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#161 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#162 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#163 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#164 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#165 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#166 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#167 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#168 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#169 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#170 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#171 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#172 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#173 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#174 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#175 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#176 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#177 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#178 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#179 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#180 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#181 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#182 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#183 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#184 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#185 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#186 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#187 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#188 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#189 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#190 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#191 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#192 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#193 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#194 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#195 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#196 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#197 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#198 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#199 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#200 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#201 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#202 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#203 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#204 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#205 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#206 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#207 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#208 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#209 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#210 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#211 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#212 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#213 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#214 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#215 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#216 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#217 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#218 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#219 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#220 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#221 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#222 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#223 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#224 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#225 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#226 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#227 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#228 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#229 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#230 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#231 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#232 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#233 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#234 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#235 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#236 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#237 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#238 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#239 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql.\x00...', Array)
#240 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db.\x00*\x00sql', Array)
#241 /var/www/joomla5/libraries/src/Form/Form.php(182): Joomla\CMS\Form\Form->bindLevel('\x00*\x00_db', Array)
#242 /var/www/joomla5/libraries/src/Form/Form.php(142): Joomla\CMS\Form\Form->bindLevel(NULL, Array)
#243 /var/www/joomla5/libraries/src/MVC/Model/FormBehaviorTrait.php(119): Joomla\CMS\Form\Form->bind(Object(Akeeba\Component\ATS\Administrator\Table\PostTable))
#244 /home/akeebadev/joomla5/ats/component/backend/src/Model/PostModel.php(71): Joomla\CMS\MVC\Model\FormModel->loadForm('com_ats.post_ne...', 'post_new', Array)
#245 /home/akeebadev/joomla5/ats/component/backend/src/View/Ticket/HtmlView.php(111): Akeeba\Component\ATS\Administrator\Model\PostModel->getForm(Array)
#246 /var/www/joomla5/libraries/src/MVC/Controller/BaseController.php(658): Akeeba\Component\ATS\Administrator\View\Ticket\HtmlView->display()
#247 /home/akeebadev/joomla5/ats/component/backend/src/Mixin/ControllerEventsTrait.php(74): Joomla\CMS\MVC\Controller\BaseController->display()
#248 /var/www/joomla5/libraries/src/Dispatcher/ComponentDispatcher.php(143): Akeeba\Component\ATS\Administrator\Controller\TicketController->execute('main')
#249 /home/akeebadev/joomla5/ats/component/backend/src/Dispatcher/Dispatcher.php(74): Joomla\CMS\Dispatcher\ComponentDispatcher->dispatch()
#250 /var/www/joomla5/libraries/src/Component/ComponentHelper.php(361): Akeeba\Component\ATS\Administrator\Dispatcher\Dispatcher->dispatch()
#251 /var/www/joomla5/libraries/src/Application/SiteApplication.php(218): Joomla\CMS\Component\ComponentHelper::renderComponent('com_ats')
#252 /var/www/joomla5/libraries/src/Application/SiteApplication.php(261): Joomla\CMS\Application\SiteApplication->dispatch()
#253 /var/www/joomla5/libraries/src/Application/CMSApplication.php(306): Joomla\CMS\Application\SiteApplication->doExecute()
#254 /var/www/joomla5/includes/app.php(65): Joomla\CMS\Application\CMSApplication->execute()
#255 /var/www/joomla5/index.php(32): require_once('/Users/nicholas...')
The infinite recursion happens at line 182 of the Form class. It is caused by line 164. $data
is a Table object. However, it is no longer a CMSObject. Therefore, Joomla! skips over the if-block on lines 164-166 and executes line 169. Casting an object to an array includes private and protected properties, with their names prefixed by a NULL byte (\x00
) plus some other stuff, depending on whether they are private or protected. Using the getProperties
method, however, only returns public properties i.e. it excludes things like _db
.
While this is a pretty rare occurrence, debugging this is hard. It requires having prior knowledge of Table no longer extending CMSObject while it previously did. The current code base offers no clues to that. We only discovered the issue because our lead developer had a conversation about CMSObject with your maintainers several months ago.
Looking at #40999 we can plainly see that the observed behaviour is unintended, i.e. it is a bug.
Moreover, iterating through private and protected properties while binding data to a form is at best a waste of time, at worst the source of a hard to troubleshoot bug.
Finally, returning protected and private properties in the serializer is unexpected and can lead to serious vulnerabilities (information disclosure, including database connection information).
Change \Joomla\CMS\Form\Form
line 164 from
} elseif ($data instanceof CMSObject) {
to
} elseif ($data instanceof CMSObject || method_exists($data, 'getProperties')) {
Temporary mitigation in 3PD code: In the model's loadFormData
we replaced lines previously looking like this:
$data = $this->getItem();
with
$data = (object) $this->getItem()->getProperties();
Change \Joomla\CMS\Serializer\JoomlaSerializer
line 71 from
if ($post instanceof CMSObject) {
to
if ($post instanceof CMSObject || || method_exists($post, 'getProperties')) {
Temporary mitigation in 3PD code: We strip the returned properties of any protected and private members with a simple array_filter
:
$properties = array_filter(
$properties,
fn($x) => !empty($x) && !is_numeric($x) && ord(substr($x, 0, 1)) !== 0,
ARRAY_FILTER_USE_KEY
)
Our mitigation is based on the fact that PHP object property names cannot start with a null byte, and the observation that PHP prefixes the keys corresponding to protected and private properties with a null byte when you cast an object to an array, see https://3v4l.org/SNTvf
None. Instead, it removes the unintended side effects added to Joomla! accidentally.
Labels |
Added:
No Code Attached Yet
|
Status | New | ⇒ | Closed |
Closed_Date | 0000-00-00 00:00:00 | ⇒ | 2023-08-29 09:38:07 |
Closed_By | ⇒ | Fedik |
Status | Closed | ⇒ | New |
Closed_Date | 2023-08-29 09:38:07 | ⇒ | |
Closed_By | Fedik | ⇒ |
Hm, the fix is for Form::bindLevel
\Joomla\CMS\Serializer\JoomlaSerializer::getAttributes
still need to be fixed. But I think it can be very similar.
Just loop the data in foreach, and collect public properties.
Status | New | ⇒ | Closed |
Closed_Date | 0000-00-00 00:00:00 | ⇒ | 2023-08-29 10:04:36 |
Closed_By | ⇒ | Fedik |
mhm... I think this is not going to truly fix the problem.
The data is no longer an array when it reaches the iteration which expects an array.
Your solution might work because PHP can iterate through objects; however, I would prefer it if everything went explicitly through getProperties
because we might have objects with private/protected variables and magic getters/setters.
The way this was handled before was extending them from CMSObject and overriding getProperties
.
It seems that what you are doing now is a b/c break you have not documented anywhere, not even in the PR which implemented this change.
The data is no longer an array when it reaches the iteration which expects an array.
The PHP will handle it.
because we might have objects with private/protected variables
If someone want to expose protected properties, then can implement Iterator
on his object.
We cannot blindly use getProperties
on any object, we should have an interface for it. But that another question.
I don't mind if someone suggest a better fix.
Status | Closed | ⇒ | New |
Closed_Date | 2023-08-29 10:04:36 | ⇒ | |
Closed_By | Fedik | ⇒ |
I’m on holiday and back on the 8th. If you remind me then ill try and take a look. In the meantime
@HLeithner as release manager
I'm not sure about this, removing CMSObject
from the Table
make sense to me. Blindly detecting a getProperties
method is not optimal. We have the Registry::toArray()
for this for special conversation.
On the other hand I think it also make sense to filter all private (including pseudo private _ prefixed) and protected variables from the converted array.... but not sure what impact we have in this case...
Labels |
Added:
bug
|
The fix is there #41342 please test