joomla / joomla-cms

Home of the Joomla! Content Management System
https://www.joomla.org
GNU General Public License v2.0
4.75k stars 3.64k forks source link

[5.0] Side effects of removing CMSObject from Table inheritance tree #41508

Open tampe125 opened 1 year ago

tampe125 commented 1 year ago

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:

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

Fedik commented 1 year ago

The fix is there https://github.com/joomla/joomla-cms/pull/41342 please test

Fedik commented 1 year ago

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.

Fedik commented 1 year ago

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

tampe125 commented 1 year ago

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.

Fedik commented 1 year ago

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.

wilsonge commented 1 year ago

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

HLeithner commented 1 year ago

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