]> granicus.if.org Git - php/commitdiff
fix leaking streams and memory mapped files
authorAnatol Belski <ab@php.net>
Sun, 11 Dec 2016 01:52:02 +0000 (02:52 +0100)
committerAnatol Belski <ab@php.net>
Fri, 16 Dec 2016 23:12:19 +0000 (00:12 +0100)
(cherry picked from commit f1ff23095b1a4fe6d6a65331dda7832ae02eb1a1)

ext/phar/phar.c

index 860f5132d446a7b24c2bbf050ce6949381ea8db5..f3054f5cbba34b3b753327150ab26e018fc7a7cc 100644 (file)
@@ -3287,19 +3287,31 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
 
                                /* zip or tar-based phar */
                                spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
-                               if (SUCCESS == phar_orig_zend_open((const char *)name, file_handle)) {
+                               if (SUCCESS == phar_orig_zend_open((const char *)name, &f)) {
+
                                        efree(name);
                                        name = NULL;
-                                       file_handle->filename = f.filename;
-                                       if (file_handle->opened_path) {
-                                               efree(file_handle->opened_path);
+
+                                       f.filename = file_handle->filename;
+                                       if (f.opened_path) {
+                                               efree(f.opened_path);
+                                       }
+                                       f.opened_path = file_handle->opened_path;
+                                       f.free_filename = file_handle->free_filename;
+
+                                       switch (file_handle->type) {
+                                               case ZEND_HANDLE_STREAM:
+                                               case ZEND_HANDLE_MAPPED:
+                                                       if (file_handle->handle.stream.closer && file_handle->handle.stream.handle) {
+                                                               file_handle->handle.stream.closer(file_handle->handle.stream.handle);
+                                                       }
+                                                       file_handle->handle.stream.handle = NULL;
+                                                       break;
                                        }
-                                       file_handle->opened_path = f.opened_path;
-                                       file_handle->free_filename = f.free_filename;
-                               } else {
                                        *file_handle = f;
                                }
                        } else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) {
+                               zend_file_handle_dtor(file_handle);
                                /* compressed phar */
                                file_handle->type = ZEND_HANDLE_STREAM;
                                /* we do our own reading directly from the phar, don't change the next line */