PHP: FTPs Memory Leak

Donnerstag, 11 Juli 2013 11:04 geschrieben von Marco Beierer

PHP LogoBei der Implementierung eines FTPs Clients in PHP habe ich gestern ein problematisches Memory Leak in PHP entdeckt. Das Speicherleck tritt nur bei FTP-Verbindungen über SSL auf. Standard FTP-Verbindungen sind nicht betroffen.

Da bei jedem Aufruf von ftp_get() und ftp_fget() Speicher verloren geht und ich via FTP eine komplette Website sichern wollte, wurde der komplette verfügbare Speicher noch vor Beendigung des Skripts aufgefressen. Neben den get-Funktionen ist auch ftp_login() betroffen.

Ursache des Memory Leaks ist, dass in der Datei ext/ftp/ftp.c beim Schließen jeder SSL-Verbindung nur die OpenSSL Funktion SSL_shutdown(), nicht jedoch SSL_free() aufgerufen wird. SSL_shutdown() schließt zwar die Verbindung, gibt den Speicher jedoch nicht wieder frei.

Wie kann ich den Bug nachvollziehen?

Wer den Bug nachvollziehen möchte, kann das folgende PHP-Skript beispielsweise mir Valgrind testen:

<?php
$hostname = '';
$port = '21';
$username = '';
$password = '';

$file = 'index.php';
$connection = ftp_ssl_connect($hostname, $port);

ftp_login($connection, $username, $password);
ftp_pasv($connection, true);
ftp_get($connection, $file, $file, FTP_ASCII);
ftp_close($connection);
?>

Wo finde ich den Patch?

Ein offizieller Patch steht momentan leider noch nicht zur Verfügung, allerdings ist es relativ einfach das Leck zu beseitigen. Hierzu muss PHP jedoch neu kompiliert werden.

Wer an dem Patch interessiert ist, findet ihn im Anhang des Bug Reports auf php.net:
https://bugs.php.net/bug.php?id=65228