No Code Attached Yet bug
avatar tampe125
tampe125
29 Aug 2023

What needs to be fixed

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.

Why this should be fixed

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).

How would you fix it

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

Side Effects expected

None. Instead, it removes the unintended side effects added to Joomla! accidentally.

@wilsonge @laoneo

avatar tampe125 tampe125 - open - 29 Aug 2023
avatar joomla-cms-bot joomla-cms-bot - change - 29 Aug 2023
Labels Added: No Code Attached Yet
avatar joomla-cms-bot joomla-cms-bot - labeled - 29 Aug 2023
avatar Fedik Fedik - change - 29 Aug 2023
Status New Closed
Closed_Date 0000-00-00 00:00:00 2023-08-29 09:38:07
Closed_By Fedik
avatar Fedik Fedik - close - 29 Aug 2023
avatar Fedik
Fedik - comment - 29 Aug 2023

The fix is there #41342 please test

avatar Fedik Fedik - change - 29 Aug 2023
Status Closed New
Closed_Date 2023-08-29 09:38:07
Closed_By Fedik
avatar Fedik Fedik - reopen - 29 Aug 2023
avatar Fedik
Fedik - comment - 29 Aug 2023

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.

avatar Fedik Fedik - close - 29 Aug 2023
avatar Fedik
Fedik - comment - 29 Aug 2023

Okay, this should work for JoomlaSerializer::getAttributes #41511, please test

avatar Fedik Fedik - change - 29 Aug 2023
Status New Closed
Closed_Date 0000-00-00 00:00:00 2023-08-29 10:04:36
Closed_By Fedik
avatar tampe125
tampe125 - comment - 29 Aug 2023

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.

avatar Fedik
Fedik - comment - 29 Aug 2023

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.

avatar wilsonge wilsonge - change - 30 Aug 2023
Status Closed New
Closed_Date 2023-08-29 10:04:36
Closed_By Fedik
avatar wilsonge wilsonge - reopen - 30 Aug 2023
avatar wilsonge
wilsonge - comment - 30 Aug 2023

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

avatar HLeithner
HLeithner - comment - 30 Aug 2023

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...

avatar brianteeman brianteeman - change - 2 Sep 2023
Labels Added: bug
avatar brianteeman brianteeman - labeled - 2 Sep 2023

Add a Comment

Login with GitHub to post a comment