From b8b880932e95ff1e575a04a6988bc0cf00b89842 Mon Sep 17 00:00:00 2001 From: Alessandro Chitolina Date: Tue, 19 Mar 2019 17:34:34 +0100 Subject: [PATCH] fix bug #76801: phpdbg too many open files error --- NEWS | 3 ++ sapi/phpdbg/phpdbg_list.c | 52 +++++++------------ sapi/phpdbg/tests/bug76801.phpt | 15 ++++++ sapi/phpdbg/tests/empty.inc | 0 ...nclude_once.phpt => include_once_001.phpt} | 0 sapi/phpdbg/tests/include_once_002.phpt | 15 ++++++ 6 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 sapi/phpdbg/tests/bug76801.phpt create mode 100644 sapi/phpdbg/tests/empty.inc rename sapi/phpdbg/tests/{include_once.phpt => include_once_001.phpt} (100%) create mode 100644 sapi/phpdbg/tests/include_once_002.phpt diff --git a/NEWS b/NEWS index dbce1af299..d2e5043518 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2019, PHP 7.2.18 +- 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-- + 1 +[Script ended normally] +prompt> +--FILE-- +