]> granicus.if.org Git - php/commitdiff
Fixed bug #64353 (Built-in classes can be unavailable with dynamic includes and Optim...
authorDmitry Stogov <dmitry@zend.com>
Tue, 5 Mar 2013 10:57:50 +0000 (14:57 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 5 Mar 2013 10:57:50 +0000 (14:57 +0400)
ZendAccelerator.c
tests/bug64353.phpt [new file with mode: 0644]

index e0576b8a0ca2a672e7bc2dc2b7e43e6a5d0e15fe..aa226706ec13882ce84c3d93e6b795ce46584ad1 100644 (file)
@@ -1207,6 +1207,20 @@ static zend_persistent_script *compile_and_cache_file(zend_file_handle *file_han
                return NULL;
        }
 
+#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
+       if (file_handle->type == ZEND_HANDLE_STREAM) {
+               char *buf;
+               size_t size, offset = 0;
+
+               /* Stream callbacks needs to be called in context of original
+                * function and class tables (see: https://bugs.php.net/bug.php?id=64353)
+                */
+               if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == FAILURE) {
+                       return NULL;
+               }
+       }
+#endif
+
        new_persistent_script = create_persistent_script();
 
        /* Save the original values for the op_array, function table and class table */
diff --git a/tests/bug64353.phpt b/tests/bug64353.phpt
new file mode 100644 (file)
index 0000000..32e70cc
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Bug #64353 (Built-in classes can be unavailable with dynamic includes and Optimizer+)
+--INI--
+zend_optimizerplus.enable=1
+zend_optimizerplus.enable_cli=1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class BugLoader extends php_user_filter {
+       public function filter($in, $out, &$consumed, $closing) {
+               if (!class_exists("Test")) {
+                       eval("class Test extends ArrayObject {}");
+               }
+               while ($bucket = stream_bucket_make_writeable($in)) {
+                       $bucket->data = strtoupper($bucket->data);
+                       $consumed += $bucket->datalen;
+//                     stream_bucket_append($out, $bucket);
+               }
+               return PSFS_PASS_ON;
+       }
+}
+
+stream_filter_register('bug.test', 'BugLoader');
+include "php://filter/read=bug.test/resource=test.php";
+echo "OK\n";
+?>
+--EXPECT--
+OK