Seite 1 von 1

[CON-554] PHP crash in is_utf8 (Schritt 3 im Setup)

Verfasst: Fr 6. Apr 2012, 11:33
von xmurrix
Das Setup auf einem Windows-System kann bei Aufruf von Schritt 3 zu einem Absturz des PHP Prozesses führen.

Die Ursache dafür ist ein PCRE Stack-Überlauf in der preg_match() Methode, also nicht ein CONTENIDO Problem. Es passiert beim Überprüfen von langen Texten auf das Vorhandensein von UTF-8 Zeichen. Siehe auch Eintrag im PHP-Bug Tracker.

Beheben kann man das vorerst indem man die zu überprüfenden Texte in kleinere Einheiten teilt. Bis es ein neues Release gibt, könnt ihr das folgendermaßen lösen:

Die Datei contenido/includes/functions.general.php öffnen und die Funktion is_utf8() gegen

Code: Alles auswählen

function is_utf8($input)
{
    // FIXME: Split long strings into smaller chunks otherwhise we could end up in a PCRE
    // stack overflow and a PHP crash, see https://bugs.php.net/bug.php?id=61213
    // TODO: Use mb_detect_encoding if available
    if (strlen($input) > 128) {
        $inputList = explode("\n", chunk_split($input, 128, "\n"));
    } else {
        $inputList = array($input);
    }

    foreach ($inputList as $item) {
        $result = 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
            )*$%xs', $item);
        
        if ($result) {
            return true;
        }
    }

    return false;
}
ersetzen.

Re: [CON-554] PHP crash in is_utf8 (Schritt 3 im Setup)

Verfasst: So 13. Mai 2012, 14:11
von kimikookskookis
Super ;) War genau was ich gesucht habe. Habe schon gedacht, es liegt an meinem XAMPP (4.8 lief normalerweise nie auf XAMPP bei mir wegen einem Datenbankproblem. Hab ich aber immer beheben können, indem ich einfach die Prüfung im Setup auskommentiert habe). Wollte das ganze jetzt nicht auf meine beta-Subdomain hochladen, weil sonst muss ich nochmal ne halbe Stunde warten, mal ganz davon abgesehen das dort bereits eine Version 4.8 läuft und ich nur eine Datenbank zur Verfügung habe.

Re: [CON-554] PHP crash in is_utf8 (Schritt 3 im Setup)

Verfasst: Fr 18. Mai 2012, 16:24
von kummer
in diesem zusammenhang mal eine grundsätzliche frage. der methodenbezeichner is_utf8 deutet darauf hin, dass damit geprüft werden soll, ob etwas im utf8-encoding vorliegt oder nicht. aber das ist ja im prinzip ja gar nicht erst möglich, resp. bloss eingschränkt bei ausreichend langen und prosaischen texten. im vorliegenden kontext vermag die methode nicht augenscheinlich sinn zu ergeben.

Re: [CON-554] PHP crash in is_utf8 (Schritt 3 im Setup)

Verfasst: Fr 18. Mai 2012, 20:19
von xmurrix
@kummer:
Ja, es wird dafür verwendet, um in Strings auf das Vorhandensein von validen UTF-8 Zeichen zu suchen. Momentan wird es nur im i18n-Bereich eingesetzt, um mit UTF-8 kodierte Zeichenketten in ISO-8859-1 zu dekodieren. Laut dem Autor der Funktion war dies nötig.

Vermutlich werden in Zukunft die Dateien der Übersetzungen (gettext) im UTF-8 encoding gepflegt und bei der Ausgabe sollte es aber dem Encoding des Backends, was momentan ISO-8859-1 ist, angepasst werden.