PHP 5.5.7 preg_replace et getdocument #3132

Closed
opened 10 years ago by miros · 6 comments
miros commented 10 years ago

La ligne
$dest = preg_replace("/[^._=\-\w\d]+/", "_",
du fichier

        spip/ecrire/inc/getdocument.php

provoque une erreur :
PHP Warning: preg_replace(): Compilation failed: invalid range in character class
et $dest est vide !
Et les fichiers uploadés, que ce soit par le core de spip ou médiathèque, sont donc de la forme jpg/.jpg, jpg/-1.jpg, ....

La même chose se produit dans la version 3.0 dans le fichier

        spip/ecrire/inc/documents.php

Le problème semble être du au '-'.

La ligne ` $dest = preg_replace("/[^._=\-\w\d]+/", "_",` du fichier <pre> spip/ecrire/inc/getdocument.php </pre> provoque une erreur : ` PHP Warning: preg_replace(): Compilation failed: invalid range in character class` et $dest est vide ! Et les fichiers uploadés, que ce soit par le core de spip ou médiathèque, sont donc de la forme jpg/.jpg, jpg/-1.jpg, .... La même chose se produit dans la version 3.0 dans le fichier <pre> spip/ecrire/inc/documents.php </pre> Le problème semble être du au '-'.
miros commented 10 years ago
Poster

En fait, j'ai remplacé ceci /[^.=-\w\d]+/ par cela /[^.=-\w\d]+/.
Le problème vient de la mise à jour de pcre de la version 8.33 en version 8.34 et non pas de la version de PHP.

En fait, j'ai remplacé ceci /[^._=-\w\d]+/ par cela /[^._=\-\w\d]+/. Le problème vient de la mise à jour de pcre de la version 8.33 en version 8.34 et non pas de la version de PHP.
miros commented 10 years ago
Poster

En fait, je ne sais pas trop s'il s'agit d'un problème SPIP ou pcre ou de packaging.
J'ai rapporté le bug à ma distribution préférée ;-)
https://bugs.archlinux.org/task/38323

Et bonne année 2014 !!!

En fait, je ne sais pas trop s'il s'agit d'un problème SPIP ou pcre ou de packaging. J'ai rapporté le bug à ma distribution préférée ;-) https://bugs.archlinux.org/task/38323 Et bonne année 2014 !!!
JLuc commented 10 years ago

Pour info : la regexp que tu cites sur https://bugs.archlinux.org/task/38323
preg_replace('/[^._=-\w\d]+/', "_", ...

n'est pas la même que celle que tu cites en haut de ce rapport
preg_replace("/[^._=\-\w\d]+/", "_", ...

Pour info : la regexp que tu cites sur https://bugs.archlinux.org/task/38323 `preg_replace('/[^._=-\w\d]+/', "_", ...` n'est pas la même que celle que tu cites en haut de ce rapport `preg_replace("/[^._=\-\w\d]+/", "_", ...`
Owner

c'est effectivement un vrai bug.
il faut corriger la pseudo classe de caractères (et la simplifier aussi) en :


$dest = preg_replace("/[^.=\w-]+/", "_",

c'est effectivement un vrai bug. il faut corriger la pseudo classe de caractères (et la simplifier aussi) en :<pre> $dest = preg_replace("/[^.=\w-]+/", "_", </pre>
miros commented 10 years ago
Poster

Merci, la nouvelle expression compile. Mais d'après la documentation http://perldoc.perl.org/perlre.html#Version-8-Regular-Expressions

Also, if you try to use the character classes \w , \W , \s, \S , \d , or \D as endpoints of a range, the "-" is understood literally
Donc dans l'expression originale (qui est bien /[^._=-\w\d]+/, pardon jluc, j'ai fait une faute de copier coller dans le premier message), le - devrait être interprêté comme un literal, non ?

Le fait que la libpcre ne compile plus cette expression qu'elle compilait sans soucis la version précédente, et que PHP retourne une chaine vide avec un simple warning est certainement dangereux. Il vaudrait peut-être mieux que PHP remonte une erreur fatale pour trouver plus facilement ces soucis. En effet, le plugin CFG contient par exemple la même expression régulière ligne 226 :

spip/plugins/auto/cfg/cfg/classes/cfg_fichier.php:226: $dest = preg_replace("/[^.=-\w\d]+/", "",

J'ai donc proposé ce bug à car ce genre de soucis peut être difficile à trouver dans les plugins...

Merci, la nouvelle expression compile. Mais d'après la documentation [[http://perldoc.perl.org/perlre.html#Version-8-Regular-Expressions]] > Also, if you try to use the character classes \w , \W , \s, \S , \d , or \D as endpoints of a range, the "-" is understood literally Donc dans l'expression originale (qui est bien /[^._=-\w\d]+/, pardon jluc, j'ai fait une faute de copier coller dans le premier message), le - devrait être interprêté comme un literal, non ? Le fait que la libpcre ne compile plus cette expression qu'elle compilait sans soucis la version précédente, et que PHP retourne une chaine vide avec un simple warning est certainement dangereux. Il vaudrait peut-être mieux que PHP remonte une erreur fatale pour trouver plus facilement ces soucis. En effet, le plugin CFG contient par exemple la même expression régulière ligne 226 : > spip/plugins/auto/cfg/cfg/classes/cfg_fichier.php:226: $dest = preg_replace("/[^._=-\w\d]+/", "_", J'ai donc proposé ce bug à [[http://bugs.exim.org/show_bug.cgi?id=1429]] car ce genre de soucis peut être difficile à trouver dans les plugins...
Owner

corrigé par r21091
Statut changé à Fermé

corrigé par r21091 **Statut changé à Fermé**
Sign in to join this conversation.
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: spip/spip#3132
Loading…
There is no content yet.