Bug svn10000 SPIP 3 #3697

Closed
opened 7 years ago by miros · 4 comments
miros commented 7 years ago

Bonjour,

Je suis tombé sur un bug sur le processus de mise-à-jour de la base lors d'une migration vers SPIP3.

En effet lorsque un dossier n'est pas présent (comme dans le cas d'une installation fraiche de SPIP 3.1 à partir du fichier Zip) on obtient des erreurs PHP qui remplissent les logs du serveur Web (dans mon cas Nginx) et saturent le disque.

D'après la doc http://php.net/manual/fr/function.opendir.php, la fonction opendir renvoie False en cas de soucis et non une ressource. Il faut soit ignorer ce warning soit contrôler préalablement que le dossier existe :

--- spip-3.1/ecrire/maj/svn10000.php    2016-01-06 17:34:04.000000000 +0100
+++ spip3/ecrire/maj/svn10000.php       2016-02-12 15:44:04.952961945 +0100
`` -674,8 +674,9 ``
 function ranger_cache_gd2() {
        spip_log("ranger_cache_gd2");
        $base = _DIR_VAR . "cache-gd2/";
-       $dir = opendir($base);
-       while (($f = readdir($dir)) !== false) {
+       if (is_dir($base)) {
+         if ($dir = opendir($base)) {
+           while (($f = readdir($dir)) !== false) {
                if (!is_dir($base . $f) and strncmp($f, ".", 1) !== 0
                        and preg_match(",[0-9a-f]{32}\.\w+,", $f)
                ) {
`` -687,6 +688,8 ``
                if (time() >= _TIME_OUT) {
                        return;
                }
+           }
+         }
        }
 }

Cdt,

A+, MiKaël.
http://www.klnavarro.fr

Bonjour, Je suis tombé sur un bug sur le processus de mise-à-jour de la base lors d'une migration vers SPIP3. En effet lorsque un dossier n'est pas présent (comme dans le cas d'une installation fraiche de SPIP 3.1 à partir du fichier Zip) on obtient des erreurs PHP qui remplissent les logs du serveur Web (dans mon cas Nginx) et saturent le disque. D'après la doc http://php.net/manual/fr/function.opendir.php, la fonction `opendir` renvoie `False` en cas de soucis et non une ressource. Il faut soit ignorer ce warning soit contrôler préalablement que le dossier existe : <pre> <patch> --- spip-3.1/ecrire/maj/svn10000.php 2016-01-06 17:34:04.000000000 +0100 +++ spip3/ecrire/maj/svn10000.php 2016-02-12 15:44:04.952961945 +0100 `` -674,8 +674,9 `` function ranger_cache_gd2() { spip_log("ranger_cache_gd2"); $base = _DIR_VAR . "cache-gd2/"; - $dir = opendir($base); - while (($f = readdir($dir)) !== false) { + if (is_dir($base)) { + if ($dir = opendir($base)) { + while (($f = readdir($dir)) !== false) { if (!is_dir($base . $f) and strncmp($f, ".", 1) !== 0 and preg_match(",[0-9a-f]{32}\.\w+,", $f) ) { `` -687,6 +688,8 `` if (time() >= _TIME_OUT) { return; } + } + } } } </patch> </pre> Cdt, -- A+, MiKaël. http://www.klnavarro.fr
Owner

Très bonne remarque. Merci du signalement.

Très bonne remarque. Merci du signalement.
Owner

Appliqué par r22831 et reporté par r22832. Merci.

Cependant je m'étonne que cette erreur là «remplissent les logs du serveur Web», d'autant que l'erreur n'est pas critique.
Normalement le if ($dir = opendir(...)) n'entre pas dans le if si opendir retourne false. Par contre, oui ça créait une erreur PHP si le dossier n'existait pas, mais qui ne devrait pas perturber il me semble la suite du processus de mise à jour. Je n'ai pas été vérifier cependant.

Version cible mise à 3.1
Statut changé à Fermé

Appliqué par r22831 et reporté par r22832. Merci. Cependant je m'étonne que cette erreur là «remplissent les logs du serveur Web», d'autant que l'erreur n'est pas critique. Normalement le `if ($dir = opendir(...))` n'entre pas dans le if si opendir retourne `false`. Par contre, oui ça créait une erreur PHP si le dossier n'existait pas, mais qui ne devrait pas perturber il me semble la suite du processus de mise à jour. Je n'ai pas été vérifier cependant. **Version cible mise à 3.1** **Statut changé à Fermé**
Poster

Cependant je m'étonne que cette erreur là «remplissent les logs du serveur Web», d'autant que l'erreur n'est pas critique.
Normalement le if ($dir = opendir(...)) n'entre pas dans le if si opendir retourne false. Par contre, oui ça créait une erreur PHP si le dossier n'existait pas, mais qui ne devrait pas perturber il me semble la suite du processus de mise à jour. Je n'ai pas été vérifier cependant.

Effectivement le if ($dir = opendir(...)) n'entre pas dans le if si opendir retourne false, mais ce n'est pas le code que j'ai dans l'archive spip-3.1.zip (r22707 aujourd'hui en date du 6 janvier), au lieu de ça j'ai seulement (sans le if) :

$dir = opendir($base);
while (($f = readdir($dir)) !== false) {
...

De plus je suis d'accord, ce n'est pas une Erreur mais un simple Warning que l'on retrouve dans /var/log/nginx/error.log :

2016/02/14 12:36:04 [error] 1141#0: *197 FastCGI sent in stderr: "PHP message: PHP Warning:  opendir(baddir/): failed to open dir: No such file or directory in /home/mickey/public_html/test-opendir.php on line 2
PHP message: PHP Warning:  readdir() expects parameter 1 to be resource, boolean given in /home/mickey/public_html/test-opendir.php on line 3" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /~mickey/test-opendir.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost"

Ensuite le test while (($f = readdir($dir)) !== false) rentre dans une boucle infinie et c'est avec ça que j'ai créé un log de plus de 2Go !

D'après les commit, je vois que c'était déjà corrigé dans la version SVN, mais un test supplémentaire mange pas de pain ça sera plus robuste et évitera l'écriture d'un Warning dans les logs pour rien :)

En tout cas merci pour votre réactivité.

> Cependant je m'étonne que cette erreur là «remplissent les logs du serveur Web», d'autant que l'erreur n'est pas critique. > Normalement le `if ($dir = opendir(...))` n'entre pas dans le if si opendir retourne `false`. Par contre, oui ça créait une erreur PHP si le dossier n'existait pas, mais qui ne devrait pas perturber il me semble la suite du processus de mise à jour. Je n'ai pas été vérifier cependant. Effectivement le `if ($dir = opendir(...))` n'entre pas dans le `if` si `opendir` retourne `false`, mais ce n'est pas le code que j'ai dans l'archive spip-3.1.zip (r22707 aujourd'hui en date du 6 janvier), au lieu de ça j'ai seulement (sans le `if`) : <pre> $dir = opendir($base); while (($f = readdir($dir)) !== false) { ... </pre> De plus je suis d'accord, ce n'est pas une Erreur mais un simple Warning que l'on retrouve dans `/var/log/nginx/error.log` : <pre> 2016/02/14 12:36:04 [error] 1141#0: *197 FastCGI sent in stderr: "PHP message: PHP Warning: opendir(baddir/): failed to open dir: No such file or directory in /home/mickey/public_html/test-opendir.php on line 2 PHP message: PHP Warning: readdir() expects parameter 1 to be resource, boolean given in /home/mickey/public_html/test-opendir.php on line 3" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /~mickey/test-opendir.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost" </pre> Ensuite le test `while (($f = readdir($dir)) !== false)` rentre dans une boucle infinie et c'est avec ça que j'ai créé un log de plus de 2Go ! D'après les commit, je vois que c'était déjà corrigé dans la version SVN, mais un test supplémentaire mange pas de pain ça sera plus robuste et évitera l'écriture d'un Warning dans les logs pour rien :) En tout cas merci pour votre réactivité.
Owner

Ah oui ok, ça avait été amélioré un peu il n'y a pas longtemps par r22793 et reporté en 3.1 une partie avec r22794 (dont ce fichier en question).

Ceci explique cela.

Ah oui ok, ça avait été amélioré un peu il n'y a pas longtemps par r22793 et reporté en 3.1 une partie avec r22794 (dont ce fichier en question). Ceci explique cela.
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.