PHP5.2.12 - Bug #50875

Décidément, les mises à jour PHP se suivent et avec elles leur lot de surprises. Après une vilaine version 5.3, voici la version 5.2.12 qui, à cause d'un bug dans le module PDO, casse l'usage même des constructeurs pour les données SQL récupérées sous forme d'objet.

Sous la version 5.2.12, l'objet est vide lorsque la méthode __construct est appelée, toute initialisation complémentaire est alors impossible :

<?php

class contents_WdActiveRecord extends system_nodes_WdActiveRecord
{
    public function __construct()
    {
        parent::__construct();

        if (empty($this->excerpt))
        {
            unset($this->excerpt);
        }
    }

    ...

    protected function __get_excerpt()
    {
        return wd_excerpt((string) $this);
    }
}

Ce morceau de code vient de l'objet Contents de mon CMS. Les objets Contents ont un contenu et un résumé qui peut être ou non défini par l'utilisateur. Le résumé du contenu se trouve dans la propriété excerpt. Je vous parle d'excerpt et d'un coup d'oeil à la classe contents_WdActiveRecord vous avez repéré la méthode protégée __get_excerpt.

La méthode protégée __get_excerpt est appelée lorsque l'on essaie d'accéder à la propriété excerpt et que la propriété n'est pas définie dans l'objet. Vous allez me dire « mais la propriété est définie puisque, même si elle est vide, elle est récupérée de la base de données ». Je vous invite maintenant à regarder le constructeur de l'objet.

Lors de la construction de l'objet, si l'attribut excerpt est vide, il est supprimé des propriétés de l'objet (en utilisant la fonction unset). Ce qui fait que si l'utilisateur ne définit pas de résumé, la propriété excerpt est supprimée de l'objet, et un résumé est automatiquement crée à partir du contenu lorsque l'on accède à la propriété excerpt.

Tout cela est donc remis en cause par le bug #50875.

Une petit enquête sur le bug

Heureusement (en italique, parce que ce n'est pas très heureux), des projets plus renommés que les miens souffrent pareillement de cette mise à jour, notamment Habari Project qui voit ses fonctionnalités réduites à néant :

« Unfortunately this commit has now made into two releases, 5.2.12 and 5.3.1, and has broken our software. We relied on the behaviour (the expected behaviour) to have properties set (using magic __set) before the constructor was called, to determine what data came from the DB, and what data has been updated since. »

On apprend d'ailleurs dans le billet PDO Bug introduced in revision 290786 and released in 5.2.12 and 5.3.1 que le bug a été introduit 4 jours avant la release !? De quoi s'interroger sur le mode de validation du code avant les dites release.

Malheureusement le mal est fait et OVH a déjà mis à jour ses serveurs sans prendre beaucoup de temps pour réfléchir.

De grises prévisions

Il y a quelques mois je lisais un article sur le manque d'implication des développeurs dans le projet PHP (je parle de PHP lui-même), et surtout la chute du nombre de contributeurs. Le bug #48770 n'est toujours pas résolu depuis le mois d'août, il serait peut-être temps pour nous de retourner au C pour voir ce que l'on peut faire.

Laisser un commentaire

Pas de commentaire