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

Alle bestätigten Fehler in CONTENIDO 4.9 (erledigte Fehler werden durch geschlossene Beiträge gekennzeichnet).
Antworten
xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

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

Beitrag von xmurrix » Fr 6. Apr 2012, 11:33

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.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

kimikookskookis
Beiträge: 0
Registriert: So 13. Mai 2012, 14:05
Kontaktdaten:

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

Beitrag von kimikookskookis » So 13. Mai 2012, 14:11

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.

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

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

Beitrag von kummer » Fr 18. Mai 2012, 16:24

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.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

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

Beitrag von xmurrix » Fr 18. Mai 2012, 20:19

@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.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Antworten