]> granicus.if.org Git - php/commitdiff
Fixed bug #79987 (Memory leak in SplFileInfo because of missing zend_restore_error_ha...
authorDmitry Stogov <dmitry@zend.com>
Tue, 18 Aug 2020 08:08:04 +0000 (11:08 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 18 Aug 2020 08:08:04 +0000 (11:08 +0300)
NEWS
ext/spl/spl_directory.c
ext/spl/tests/bug79987.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index c0d14769a227f3d9fb035b2bbbc092919996d88c..1f27ce6b62339080ef9e871aa5ad94f8aee1ee20 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? ????, PHP 8.0.0beta2
 
+- SPL:
+  . Fixed bug #79987 (Memory leak in SplFileInfo because of missing
+    zend_restore_error_handling()). (Dmitry)
 
 06 Aug 2020, PHP 8.0.0beta1
 
index 93299470c93114508bd17d48438acd8dd468d249..0836e18bc4534371f0769ee5bb60a126758e01a8 100644 (file)
@@ -1224,16 +1224,19 @@ PHP_METHOD(SplFileInfo, getLinkTarget)
 
        if (intern->file_name == NULL) {
                if (spl_filesystem_object_get_file_name(intern) != SUCCESS) {
+                       zend_restore_error_handling(&error_handling);
                        RETURN_THROWS();
                }
        }
 #if defined(PHP_WIN32) || defined(HAVE_SYMLINK)
        if (intern->file_name == NULL) {
+               zend_restore_error_handling(&error_handling);
                php_error_docref(NULL, E_WARNING, "Empty filename");
                RETURN_FALSE;
        } else if (!IS_ABSOLUTE_PATH(intern->file_name, intern->file_name_len)) {
                char expanded_path[MAXPATHLEN];
                if (!expand_filepath_with_mode(intern->file_name, expanded_path, NULL, 0, CWD_EXPAND )) {
+                       zend_restore_error_handling(&error_handling);
                        php_error_docref(NULL, E_WARNING, "No such file or directory");
                        RETURN_FALSE;
                }
@@ -1275,6 +1278,7 @@ PHP_METHOD(SplFileInfo, getRealPath)
 
        if (intern->type == SPL_FS_DIR && !intern->file_name && intern->u.dir.entry.d_name[0]) {
                if (spl_filesystem_object_get_file_name(intern) != SUCCESS) {
+                       zend_restore_error_handling(&error_handling);
                        RETURN_THROWS();
                }
        }
diff --git a/ext/spl/tests/bug79987.phpt b/ext/spl/tests/bug79987.phpt
new file mode 100644 (file)
index 0000000..bda5841
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug #79987 (Memory leak in SplFileInfo because of missing zend_restore_error_handling())
+--FILE--
+<?php
+class BadSplFileInfo extends SplFileInfo {
+    public function __construct() {
+    }
+}
+$x = new BadSplFileInfo();
+set_error_handler(function ($type, $msg, $file, $line, $context = []) {
+    echo "ops\n";
+});
+try {
+    var_dump($x->getLinkTarget());
+} catch (Throwable $e) {
+    echo $e->getMessage() . "\n";
+}
+--EXPECT--
+Object not initialized