summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--sapi/phpdbg/phpdbg_list.c52
-rw-r--r--sapi/phpdbg/tests/bug76801.phpt15
-rw-r--r--sapi/phpdbg/tests/empty.inc0
-rw-r--r--sapi/phpdbg/tests/include_once_001.phpt (renamed from sapi/phpdbg/tests/include_once.phpt)0
-rw-r--r--sapi/phpdbg/tests/include_once_002.phpt15
6 files changed, 52 insertions, 33 deletions
diff --git a/NEWS b/NEWS
index 30a0b19ea8..9f3dd9916a 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ PHP NEWS
. Fixed bug #77773 (Unbuffered queries leak memory - MySQLi / mysqlnd).
(Nikita)
+- phpdbg:
+ . Fixed bug #76801 (too many open files). (alekitto)
+
- Reflection:
. Fixed bug #77772 (ReflectionClass::getMethods(null) doesn't work). (Nikita)
diff --git a/sapi/phpdbg/phpdbg_list.c b/sapi/phpdbg/phpdbg_list.c
index 865f75bc27..cb0250e9e0 100644
--- a/sapi/phpdbg/phpdbg_list.c
+++ b/sapi/phpdbg/phpdbg_list.c
@@ -234,33 +234,33 @@ void phpdbg_list_function_byname(const char *str, size_t len) /* {{{ */
/* Note: do not free the original file handler, let original compile_file() or caller do that. Caller may rely on its value to check success */
zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
phpdbg_file_source data, *dataptr;
- zend_file_handle fake;
zend_op_array *ret;
- char *filename;
uint32_t line;
char *bufptr, *endptr;
+ int size;
- if (zend_stream_fixup(file, &bufptr, &data.len) == FAILURE) {
- return PHPDBG_G(compile_file)(file, type);
+ ret = PHPDBG_G(compile_file)(file, type);
+ if (ret == NULL) {
+ return ret;
}
- filename = (char *)(file->opened_path ? ZSTR_VAL(file->opened_path) : file->filename);
+ if (file->type == ZEND_HANDLE_MAPPED) {
+ data.len = file->handle.stream.mmap.len;
+ data.buf = emalloc(data.len + 1);
+ memcpy(data.buf, file->handle.stream.mmap.buf, data.len);
+ } else {
+ if (file->type == ZEND_HANDLE_FILENAME) {
+ zend_stream_open(file->filename, file);
+ }
- data.buf = emalloc(data.len + ZEND_MMAP_AHEAD + 1);
- if (data.len > 0) {
- memcpy(data.buf, bufptr, data.len);
+ size = file->handle.stream.fsizer(file->handle.stream.handle);
+ data.buf = emalloc(size + 1);
+ data.len = file->handle.stream.reader(file->handle.stream.handle, data.buf, size);
}
- memset(data.buf + data.len, 0, ZEND_MMAP_AHEAD + 1);
- data.line[0] = 0;
- memset(&fake, 0, sizeof(fake));
- fake.type = ZEND_HANDLE_MAPPED;
- fake.handle.stream.mmap.buf = data.buf;
- fake.handle.stream.mmap.len = data.len;
- fake.free_filename = 0;
- fake.filename = filename;
- fake.opened_path = file->opened_path;
+ memset(data.buf + data.len, 0, 1);
+ data.line[0] = 0;
*(dataptr = emalloc(sizeof(phpdbg_file_source) + sizeof(uint32_t) * data.len)) = data;
for (line = 0, bufptr = data.buf - 1, endptr = data.buf + data.len; ++bufptr < endptr;) {
@@ -268,28 +268,14 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
dataptr->line[++line] = (uint32_t)(bufptr - data.buf) + 1;
}
}
+
dataptr->lines = ++line;
+ dataptr = erealloc(dataptr, sizeof(phpdbg_file_source) + sizeof(uint32_t) * line);
dataptr->line[line] = endptr - data.buf;
- ret = PHPDBG_G(compile_file)(&fake, type);
-
- if (ret == NULL) {
- efree(data.buf);
- efree(dataptr);
-
- fake.opened_path = NULL;
- zend_file_handle_dtor(&fake);
-
- return NULL;
- }
-
- dataptr = erealloc(dataptr, sizeof(phpdbg_file_source) + sizeof(uint32_t) * line);
zend_hash_add_ptr(&PHPDBG_G(file_sources), ret->filename, dataptr);
phpdbg_resolve_pending_file_break(ZSTR_VAL(ret->filename));
- fake.opened_path = NULL;
- zend_file_handle_dtor(&fake);
-
return ret;
}
diff --git a/sapi/phpdbg/tests/bug76801.phpt b/sapi/phpdbg/tests/bug76801.phpt
new file mode 100644
index 0000000000..12ec8c7789
--- /dev/null
+++ b/sapi/phpdbg/tests/bug76801.phpt
@@ -0,0 +1,15 @@
+--TEST--
+include()ing files should not raise "too many open files" error
+--PHPDBG--
+r
+q
+--EXPECTF--
+[Successful compilation of %s]
+prompt> [Script ended normally]
+prompt>
+--FILE--
+<?php
+
+for ($i = 0; $i < 25000; ++$i) {
+ include __DIR__.'/empty.inc';
+}
diff --git a/sapi/phpdbg/tests/empty.inc b/sapi/phpdbg/tests/empty.inc
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sapi/phpdbg/tests/empty.inc
diff --git a/sapi/phpdbg/tests/include_once.phpt b/sapi/phpdbg/tests/include_once_001.phpt
index b91f5e83a0..b91f5e83a0 100644
--- a/sapi/phpdbg/tests/include_once.phpt
+++ b/sapi/phpdbg/tests/include_once_001.phpt
diff --git a/sapi/phpdbg/tests/include_once_002.phpt b/sapi/phpdbg/tests/include_once_002.phpt
new file mode 100644
index 0000000000..742decf10b
--- /dev/null
+++ b/sapi/phpdbg/tests/include_once_002.phpt
@@ -0,0 +1,15 @@
+--TEST--
+include_once must include only once #2
+--PHPDBG--
+r
+q
+--EXPECTF--
+[Successful compilation of %s]
+prompt> 1
+[Script ended normally]
+prompt>
+--FILE--
+<?php
+
+include __DIR__.'/include.inc';
+include_once __DIR__.'/include.inc';