CMS MADE SIMPLE FORGE

CMS Made Simple Core

 

[#12703] Version 2.2.19 : a syntax error in a udt blocks cmsmadesimple definitivly , error in class.usertagoperations.inc.php

avatar
Created By: Raymond FETIVEAU (rfetiveau)
Date Submitted: Wed Apr 03 16:26:57 -0400 2024

Assigned To:
Version: 2.2.18
CMSMS Version: 2.2.18
Severity: Major
Resolution: Fixed
State: Open
Summary:
Version 2.2.19 : a syntax error in a udt blocks cmsmadesimple definitivly , error in class.usertagoperations.inc.php
Detailed Description:
In  french :
Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une
solution.

En décembre 2023, j'ai eu l'erreur suivante qui m'a bloqué CmsMadeSimple
définitivement (l'erreur revenait à chaque appel de index.php) :
Parse error: syntax error, unexpected '}' in
/..../..../www/cms/lib/classes/class.usertagoperations.inc.php(306) : eval()'d
code on line 1399
J'ai dû réinstaller le cms (version 2.2.19) dans un dossier différent.
Mais au bout de quelques jours, le problème est revenu. J'ai bien dû réinstaller
une dizaine de fois.
J'ai été tranquille pendant 3 mois, mais c'est reparti.
Je précise que cela se produit lorsque j'essaie d'enregistrer une balise
utilisateur (udt) et que ça ne m'était jamais arrivé avant que je mette le php
en version development au lieu de production dans www/.ovhconfig
Mais cette fois,  j'ai enfin trouvé comment supprimer l'affichage permanent de
l'erreur et le blocage.
C'est pourquoi je vous expose ma méthode au cas où vous auriez les mêmes soucis.
Il va quand même falloir mettre les mains dans le cambouis (le php)
Mais je me demande toujours pourquoi certaines fois, les udt sont enregistrés
même s'il y a une erreur.

L'erreur est donc dans class.usertagoperations.inc.php, à la ligne 306 pour
@eval($code)

    function CreateTagFunction($name)
298    {   print $name.'<br>'; //ajouté
299  $row = $this->_get_from_cache($name);
        if( !$row ) return;
        $functionname = 'cms_user_tag_'.$name;
        if( !function_exists($functionname) ) {
if( startswith($row['code'],'<?php') ) $row['code'] =
substr($row['code'],5);
if( endswith($row['code'],'?>') ) $row['code'] =
substr($row['code'],0,-2);
$code = 'function '.$functionname.'($params,$smarty)
{'.$row['code']."\n}";
306            @eval($code);
        }
        return $functionname;
    }

J'ai longtemps cru, à cause de la ligne 299, que c'était  un problème de cache,
mais effacer le cache ne réglait rien.
J'ai ajouté print $name à la ligne 298 pour voir quelle balise provoquait le
blocage (l'affichage de l'erreur ne le mentionne pas)
En fait, on voit que tous les udt sont vérifiés à chaque appel de index.php, et
c'est donc le dernier affiché qui provoque le blocage.
Pour avoir un plus de détails sur l'erreur, et ne pas bloquer le cms, j'ai
ajouté un try - catch autour de @eval($code) :
306          try { eval(@$code); }
                catch (ParseError $err) {
                    print "Erreur dans $name : <br>";
                    print "$err <br>";
                    return;
                    }
Il faut catch (ParseError $err) au lieu d'un simple catch(Exception $ex) parce
que eval ne transmet pas des exceptions mais des ParseError.
On obtient alors quelque chose du style :

Erreur dans erreur2:     (erreur2 est le nom du userplugin)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in
/..../..../www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d
code:1    (1 est n° de ligne de l'erreur dans le userplugin)
Stack trace: #0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82):
UserTagOperations->CreateTagFunction('erreur2')
#1 ...
#2 ...

On peut faciliter la lecture en mettant à partir de la ligne 307 :
           catch (ParseError $err) {
$p=strpos($err,'code'); $p2=strpos($err,'Stack');
$ligne=substr($err,$p+5,$p2-$p-6);
                print "<br>Erreur dans le plugin $name, ligne $ligne : <br>";
                $p= strpos($code,'{'); $code= substr($code,$p+1);
                $lignes=explode("\n", $code); print $lignes[$ligne-1].'<br>';
                print strtok($err,'#').'<br>';
                print strtok('#').'<br>';
                return;
               }
ce qui donne maintenant :

Erreur dans le plugin erreur2, ligne 1 :
print ...   (la ligne qui contient l'erreur)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in
/www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:1
Stack trace:
0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82):
UserTagOperations->CreateTagFunction('erreur2')

On peut maintenant supprimer le print $name de la ligne 298

On a réussi à sortir de l'erreur sans bloquer le cms, mais il reste encore une
erreur dans un autre fichier ; en effet, la fonction utilisant l'udt n'a
toujours pas été créée :

Fatal error: Uncaught --> Smarty: Plugin 'erreur' not callable <-- thrown in
/..../..../www/cms4/lib/smarty/sysplugins/smarty_internal_method_registerplugin.php
on line 50

A la ligne 50 de smarty_internal_method_registerplugin.php, on trouve :     
throw new SmartyException("Plugin '{$name}' not callable");
qu'on remplace par :  print "<br>Le plugin $name est inutilisable : il faut le
corriger ou le supprimer<br>";

Le blocage est terminé , plus besoin de réinstaller !!!


History

Comments
avatar
Date: 2024-04-04 09:54
Posted By: Fernando Morgado (JoMorg)

nous avons toujours eu l'impression qu'à partir de PHP 7.1, les UDT s'arrêtaient
pour se fermer correctement et qu'une correction était due. Ce que nous n'avons
jamais eu, c'est la nécessité de réinstaller CMSMS chaque fois que l'erreur se
produisait puisque dans tous nos tests, la fonction n'était jamais stockée en
cas d'erreur. Cela semble spécifique à votre environnement et nous n'avons pas
pu le reproduire.
Dans tous les cas, le BR est accepté et sera corrigé pour la prochaine version.
Merci
      
avatar
Date: 2024-04-04 12:50
Posted By: Fernando Morgado (JoMorg)

For the record: same as BR: #12677. Fixed in SVN, thanks
      
Updates

Updated: 2024-04-04 12:50
resolution_id: 6 => 7

Updated: 2024-04-04 09:54
resolution_id: => 6