[BUGFIX] Avoid autoloading of non-objects in DataMapper 49/25349/9
authorTomita Militaru <militarutomita@gmail.com>
Tue, 12 Nov 2013 23:37:50 +0000 (01:37 +0200)
committerMarkus Klein <klein.t3@reelworx.at>
Wed, 30 Jul 2014 09:14:33 +0000 (11:14 +0200)
While persisting an object, the DataMapper is asked for the plain value
of a property, the TypeHandlingUtility::isCoreType() method is using
"is_subclass_of()" to check if the given input is an instance of
\TYPO3\CMS\Core\Type\TypeInterface.
Unfortunately, when passing a string into "is_subclass_of" it tries to
instantiate an object of that name. This will trigger the class autoloader.
Even worse, when the string contains a special char (like an umlaut) the
class cache will throw an exception (#1233057752). Thus persisting an object
with special chars in a property value is not possible at the moment.

This change fixes the issue by calling TypeHandlingUtility::isCoreType() only
if $input is an object.

Resolves: #53425
Releases: 6.3
Change-Id: I8b97499f2d90e26ba2a5dec411de266948fdf005
Reviewed-on: http://review.typo3.org/25349
Reviewed-by: Tobias Liebig <tobias.liebig@typo3.org>
Tested-by: Tobias Liebig <tobias.liebig@typo3.org>
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
typo3/sysext/extbase/Classes/Persistence/Generic/Mapper/DataMapper.php

index 1bde9db..3fef922 100644 (file)
@@ -643,10 +643,12 @@ class DataMapper implements \TYPO3\CMS\Core\SingletonInterface {
                        $parameter = implode(',', $plainValueArray);
                } elseif ($input instanceof DomainObjectInterface) {
                        $parameter = (int)$input->getUid();
-               } elseif (TypeHandlingUtility::isCoreType($input)) {
-                       $parameter = $this->getPlainStringValue($input, $parseStringValueCallback, $parseStringValueCallbackParameters);
                } elseif (is_object($input)) {
-                       throw new UnexpectedTypeException('An object of class "' . get_class($input) . '" could not be converted to a plain value.', 1274799934);
+                       if (TypeHandlingUtility::isCoreType($input)) {
+                               $parameter = $this->getPlainStringValue($input, $parseStringValueCallback, $parseStringValueCallbackParameters);
+                       } else {
+                               throw new UnexpectedTypeException('An object of class "' . get_class($input) . '" could not be converted to a plain value.', 1274799934);
+                       }
                } else {
                        $parameter = $this->getPlainStringValue($input, $parseStringValueCallback, $parseStringValueCallbackParameters);
                }