Bug in aktueller WordPress-Version 2.7 (fixed)

Die letzten Stunden hab ich mir mit einem ziemlich dummen Bug in der aktuellen WordPress-Situation um die Ohren schlagen dürfen.

Symptome

Beim Aufruf der Website erscheint gelegentlich eine leere Seite. Ein Reload hilft meistens. Welche Seite im WordPress-System man aufruft ist unerheblich. Im Apache-Error-Log sammeln sich Logmeldungen:

[Sat Jan 03 03:41:25 2009] [notice] child pid 13678 exit signal Segmentation fault (11)
[Sat Jan 03 03:41:33 2009] [notice] child pid 13684 exit signal Segmentation fault (11)
[Sat Jan 03 03:41:34 2009] [notice] child pid 12248 exit signal Segmentation fault (11)

Voraussetzungen zum Auftreten des Fehlers

WordPress muss unter einer mit https:// anfangenden URL installiert sein. Gleichzeitig darf WordPress nicht über die gleiche URL mit http:// erreichbar sein.

Fehlerbeschreibung

Der Kern des Übels liegt in der Datei wp-includes/http.php im WordPress-Verzeichnis:

748: $arrURL = parse_url($url);

753: if ( ‘http’ != $arrURL[‘scheme’] || ‘https’ != $arrURL[‘scheme’] )
754: $url = str_replace($arrURL[‘scheme’], ‘http’, $url);

WordPress ruft bei Blogaufrufen aus der Datei cron.php regelmäßig mittels http.php über eine HTTP-Verbindung die wp-cron.php auf. Die zitierte Code-Stelle befindet sich kurz vorm Aufbau der HTTP-Verbindung. Dort wird die URL in ihre Bestandteile zerlegt (parse_url()) und anschließend geprüft, ob das Verbindungs-“Schema” http oder https ist. Genau genommen wird aber geprüft, ob die URL nicht http enthält (das ist bei mir der Fall) oder nicht https enthält (bei mir nicht der Fall). Beim bool’schen Oder reicht es, wenn einer der Operanden wahr ist:
Die nächste Zeile wird immer angesprungen und das “Schema” auf http gesetzt.

Bugfix in der wp-includes/http.php

Der Entwickler meinte kein bool’sches Oder, sondern ein Und:

753: if ( ‘http’ != $arrURL[‘scheme’] && ‘https’ != $arrURL[‘scheme’] )

Dadurch wird $arrURL[‘scheme’] nur ersetzt wenn es nicht http und nicht https ist.

Leave a Reply

Your email address will not be published. Required fields are marked *