summaryrefslogtreecommitdiff
path: root/sapi/phpdbg/phpdbg_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'sapi/phpdbg/phpdbg_list.c')
-rw-r--r--sapi/phpdbg/phpdbg_list.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/sapi/phpdbg/phpdbg_list.c b/sapi/phpdbg/phpdbg_list.c
index 6d5e894930..3d64c8b077 100644
--- a/sapi/phpdbg/phpdbg_list.c
+++ b/sapi/phpdbg/phpdbg_list.c
@@ -240,24 +240,19 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
char *bufptr, *endptr;
char resolved_path_buf[MAXPATHLEN];
- if (zend_stream_fixup(file, &data.buf, &data.len) == FAILURE) {
+ if (zend_stream_fixup(file, &bufptr, &data.len) == FAILURE) {
return NULL;
}
+ data.buf = NULL;
+ if (data.len > 0) {
+ data.buf = emalloc(data.len + 1);
+ memcpy(data.buf, bufptr, data.len);
+ data.buf[data.len] = 0;
+ }
data.filename = filename;
data.line[0] = 0;
- if (file->handle.stream.mmap.old_closer) {
- /* do not unmap */
- file->handle.stream.closer = file->handle.stream.mmap.old_closer;
- }
-
-#if HAVE_MMAP
- if (file->handle.stream.mmap.map) {
- data.map = file->handle.stream.mmap.map;
- }
-#endif
-
fake.type = ZEND_HANDLE_MAPPED;
fake.handle.stream.mmap.buf = data.buf;
fake.handle.stream.mmap.len = data.len;
@@ -278,22 +273,54 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
}
dataptr->lines = ++line;
dataptr->line[line] = endptr - data.buf;
- dataptr = erealloc(dataptr, sizeof(phpdbg_file_source) + sizeof(uint) * line);
+ ret = PHPDBG_G(compile_file)(&fake, type);
+
+ if (ret == NULL) {
+ efree(data.buf);
+ efree(dataptr);
+ return NULL;
+ }
+
+ dataptr = erealloc(dataptr, sizeof(phpdbg_file_source) + sizeof(uint) * line);
zend_hash_str_add_ptr(&PHPDBG_G(file_sources), filename, strlen(filename), dataptr);
phpdbg_resolve_pending_file_break(filename);
- ret = PHPDBG_G(compile_file)(&fake, type);
-
fake.opened_path = NULL;
zend_file_handle_dtor(&fake);
+ return ret;
+}
+
+zend_op_array *phpdbg_init_compile_file(zend_file_handle *file, int type) {
+ char *filename = (char *)(file->opened_path ? ZSTR_VAL(file->opened_path) : file->filename);
+ char resolved_path_buf[MAXPATHLEN];
+ zend_op_array *ret;
+ phpdbg_file_source *dataptr;
+
+ if (VCWD_REALPATH(filename, resolved_path_buf)) {
+ filename = resolved_path_buf;
+ }
+
+ ret = PHPDBG_G(init_compile_file)(file, type);
+
+ if (ret == NULL) {
+ return NULL;
+ }
+
+ dataptr = zend_hash_str_find_ptr(&PHPDBG_G(file_sources), filename, strlen(filename));
+ ZEND_ASSERT(dataptr != NULL);
+
dataptr->op_array = ret;
- if (dataptr->op_array->refcount) {
- ++*dataptr->op_array->refcount;
- } else {
- dataptr->op_array->refcount = emalloc(sizeof(uint32_t));
- *dataptr->op_array->refcount = 2;
+ dataptr->destroy_op_array = 1;
+ if (dataptr->op_array) {
+ if (dataptr->op_array->refcount) {
+ ++*dataptr->op_array->refcount;
+ } else {
+ dataptr->op_array->refcount = emalloc(sizeof(uint32_t));
+ *dataptr->op_array->refcount = 2;
+ dataptr->destroy_op_array = 0;
+ }
}
return ret;
@@ -302,16 +329,14 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
void phpdbg_free_file_source(zval *zv) {
phpdbg_file_source *data = Z_PTR_P(zv);
-#if HAVE_MMAP
- if (data->map) {
- munmap(data->map, data->len + ZEND_MMAP_AHEAD);
- } else
-#endif
if (data->buf) {
efree(data->buf);
}
- if (destroy_op_array(data->op_array)) {
+ if (!data->destroy_op_array) {
+ efree(data->op_array->refcount);
+ }
+ if (!data->destroy_op_array || destroy_op_array(data->op_array)) {
efree(data->op_array);
}
@@ -323,3 +348,8 @@ void phpdbg_init_list(void) {
zend_hash_init(&PHPDBG_G(file_sources), 1, NULL, (dtor_func_t) phpdbg_free_file_source, 0);
zend_compile_file = phpdbg_compile_file;
}
+
+void phpdbg_list_update(void) {
+ PHPDBG_G(init_compile_file) = zend_compile_file;
+ zend_compile_file = phpdbg_init_compile_file;
+}