[spip-dev] [Bug] plantage d'apache avec is_utf8

Bonjour,

Sur la SVN 5685, je suis tombé sur un plantage d'apache windows sur la chaine :
http://www.uzine.net/spip_contrib/ecrire/articles.php3?id_article=283
placée dans un squelette (en PJ).

Apache/1.3.33 (Win32) PHP/4.4.1

En appelant page.php3?fond=bug, j'ai le bug suivant d'apache :
Apache.exe - Application Error
The exception unknown software exception (0xc00000fd) occured in the application at location 0x0054a6c8.

Et c'est function is_utf8($string) {
  return preg_match(',^(?:'
  . '[\x09\x0A\x0D\x20-\x7E]' # ASCII
  . '|[\xC2-\xDF][\x80-\xBF]' # non-overlong 2-byte
  . '|\xE0[\xA0-\xBF][\x80-\xBF]' # excluding overlongs
  . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' # straight 3-byte
  . '|\xED[\x80-\x9F][\x80-\xBF]' # excluding surrogates
  . '|\xF0[\x90-\xBF][\x80-\xBF]{2}' # planes 1-3
  . '|[\xF1-\xF3][\x80-\xBF]{3}' # planes 4-15
  . '|\xF4[\x80-\x8F][\x80-\xBF]{2}' # plane 16
  . ')*$,s', $string);
}

qui fait planter.

Je tente de passer en 4.4.2 et je vous avise du résultat.

bug.html (3.03 KB)

Jacques PYRAT a écrit :

Je tente de passer en 4.4.2 et je vous avise du résultat.

Idem.

@ Jacques Pyrat <spip.newsgroup@pyrat.net> :

Bonjour,

Sur la SVN 5685, je suis tombé sur un plantage d'apache windows sur la
chaine :
http://www.uzine.net/spip_contrib/ecrire/articles.php3?id_article=283
placée dans un squelette (en PJ).

Apache/1.3.33 (Win32) PHP/4.4.1

En appelant page.php3?fond=bug, j'ai le bug suivant d'apache :
Apache.exe - Application Error
The exception unknown software exception (0xc00000fd) occured in the
application at location 0x0054a6c8.

Et c'est function is_utf8($string) {
  return preg_match(',^(?:'
  . '[\x09\x0A\x0D\x20-\x7E]' # ASCII
  . '|[\xC2-\xDF][\x80-\xBF]' # non-overlong 2-byte
  . '|\xE0[\xA0-\xBF][\x80-\xBF]' # excluding overlongs
  . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' # straight 3-byte
  . '|\xED[\x80-\x9F][\x80-\xBF]' # excluding surrogates
  . '|\xF0[\x90-\xBF][\x80-\xBF]{2}' # planes 1-3
  . '|[\xF1-\xF3][\x80-\xBF]{3}' # planes 4-15
  . '|\xF4[\x80-\x8F][\x80-\xBF]{2}' # plane 16
  . ')*$,s', $string);
}

Peux-tu essayer de desaactiver les differentes lignes de cette regexp, en
partant du bas (commente la ligne "plane 16", puis "planes 4-15" etc) pour
voir ce que apache/win est capable de digerer ? Est-ce que par hasard ce ne
seraient pas les {2} qui feraient planter ? Si oui il suffit de répéter deux
fois ce qui est devant...

Au pire on peut remplacer cette jolie preg_match par autre chose, mais il
faudra trouver une astuce pour que ce soit quand meme assez rapide.

-- Fil

Fil a écrit :

@ Jacques Pyrat <spip.newsgroup@pyrat.net> :

Bonjour,

Sur la SVN 5685, je suis tombé sur un plantage d'apache windows sur la chaine :
http://www.uzine.net/spip_contrib/ecrire/articles.php3?id_article=283
placée dans un squelette (en PJ).

Apache/1.3.33 (Win32) PHP/4.4.1

En appelant page.php3?fond=bug, j'ai le bug suivant d'apache :
Apache.exe - Application Error
The exception unknown software exception (0xc00000fd) occured in the application at location 0x0054a6c8.

Et c'est function is_utf8($string) {
  return preg_match(',^(?:'
  . '[\x09\x0A\x0D\x20-\x7E]' # ASCII
  . '|[\xC2-\xDF][\x80-\xBF]' # non-overlong 2-byte
  . '|\xE0[\xA0-\xBF][\x80-\xBF]' # excluding overlongs
  . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' # straight 3-byte
  . '|\xED[\x80-\x9F][\x80-\xBF]' # excluding surrogates
  . '|\xF0[\x90-\xBF][\x80-\xBF]{2}' # planes 1-3
  . '|[\xF1-\xF3][\x80-\xBF]{3}' # planes 4-15
  . '|\xF4[\x80-\x8F][\x80-\xBF]{2}' # plane 16
  . ')*$,s', $string);
}

Peux-tu essayer de desaactiver les differentes lignes de cette regexp, en
partant du bas (commente la ligne "plane 16", puis "planes 4-15" etc) pour
voir ce que apache/win est capable de digerer ?

Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]' # ASCII
Il me semble que ce n'est pas une ligne bien pertinente pour détecter de l'utf.

Est-ce que par hasard ce ne
seraient pas les {2} qui feraient planter ? Si oui il suffit de répéter deux
fois ce qui est devant...

Non, c'est pas eux.

Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]'
       # ASCII

C'est de la magie noire :slight_smile:

Il me semble que ce n'est pas une ligne bien pertinente pour détecter de
l'utf.

Tu confonds : il ne s'agit pas de détecter de l'utf-8, mais de contrôler si,
oui ou non, la chaîne est valide en utf-8 (c'est-à-dire d'échouer si elle
n'est pas valide). Or les caractères ascii sont bien licites en utf-8.

-- Fil

Fil a écrit :

Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]' # ASCII

C'est de la magie noire :slight_smile:

J'évite pourtant ce genre de pratiques :wink:

Fil a écrit :

Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]' # ASCII

C'est de la magie noire :slight_smile:

Je suis allé un peu plus loin :
ça ça passe : (j'ai remplacé les codes de caractère par les raccourcis d'expression régulières)
. '\t|\n|[\x20-\x7E]' # ASCII
Et ça non :
. '\t|\n|\r|[\x20-\x7E]' # ASCII

C'est le \r qui pose problème

>> Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]'
>> # ASCII
>
> C'est de la magie noire :slight_smile:
Je suis allé un peu plus loin :
ça ça passe : (j'ai remplacé les codes de caractère par les raccourcis
d'expression régulières)
. '\t|\n|[\x20-\x7E]' # ASCII
Et ça non :
. '\t|\n|\r|[\x20-\x7E]' # ASCII

C'est le \r qui pose problème

Windows, c'est vraiment une plate-forme qui permet de développer en toute
sérénité.

Donc, si tu remplaces la ligne
        '[\x09\x0A\x0D\x20-\x7E]'
par
        '[\x09\x0A\x20-\x7E]'

et que tu mets juste avant le preg_match un str_replace("\r", "\n"), ça ne
plante plus ?

-- Fil

Fil a écrit :

Donc, j'ai plus le bug en supprimant . '[\x09\x0A\x0D\x20-\x7E]' # ASCII

C'est de la magie noire :slight_smile:

Je suis allé un peu plus loin :
ça ça passe : (j'ai remplacé les codes de caractère par les raccourcis d'expression régulières)
. '\t|\n|[\x20-\x7E]' # ASCII
Et ça non :
. '\t|\n|\r|[\x20-\x7E]' # ASCII

C'est le \r qui pose problème

Windows, c'est vraiment une plate-forme qui permet de développer en toute
sérénité.

Je te le fais pas dire...

Donc, si tu remplaces la ligne
        '[\x09\x0A\x0D\x20-\x7E]' par
        '[\x09\x0A\x20-\x7E]'

et que tu mets juste avant le preg_match un str_replace("\r", "\n"), ça ne
plante plus ?

Oui :wink:
  $string = str_replace("\r", "\n", $string);
  return preg_match(',^(?:'
  . '[\x09\x0A\x20-\x7E]' # ASCII
Passe !