Skip to content

Commit

Permalink
fix bug #76801: phpdbg too many open files error
Browse files Browse the repository at this point in the history
  • Loading branch information
alekitto authored and krakjoe committed Mar 23, 2019
1 parent 2e9dcce commit b8b8809
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 33 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
52 changes: 19 additions & 33 deletions sapi/phpdbg/phpdbg_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,62 +234,48 @@ 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;) {
if (*bufptr == '\n') {
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;
}

Expand Down
15 changes: 15 additions & 0 deletions sapi/phpdbg/tests/bug76801.phpt
Original file line number Diff line number Diff line change
@@ -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';
}
Empty file added sapi/phpdbg/tests/empty.inc
Empty file.
File renamed without changes.
15 changes: 15 additions & 0 deletions sapi/phpdbg/tests/include_once_002.phpt
Original file line number Diff line number Diff line change
@@ -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';

0 comments on commit b8b8809

Please sign in to comment.