Skip to content

Commit

Permalink
Merge branch 'PHP-7.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
bwoebi committed Dec 21, 2016
2 parents 3df4343 + 728502f commit 5d7ce72
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 14 deletions.
1 change: 0 additions & 1 deletion sapi/phpdbg/phpdbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ static void php_phpdbg_destroy_file_source(zval *data) /* {{{ */
if (source->buf) {
efree(source->buf);
}
efree(source->filename);
efree(source);
} /* }}} */

Expand Down
11 changes: 3 additions & 8 deletions sapi/phpdbg/phpdbg_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
memcpy(data.buf, bufptr, data.len);
}
memset(data.buf + data.len, 0, ZEND_MMAP_AHEAD + 1);
data.filename = filename;
data.line[0] = 0;

memset(&fake, 0, sizeof(fake));
Expand Down Expand Up @@ -284,10 +283,9 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
return NULL;
}

dataptr->filename = estrdup(dataptr->filename);
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);
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);
Expand Down Expand Up @@ -322,9 +320,7 @@ zend_op_array *phpdbg_init_compile_file(zend_file_handle *file, int type) {
return NULL;
}

filename = (char *)(file->opened_path ? ZSTR_VAL(file->opened_path) : file->filename);

dataptr = zend_hash_str_find_ptr(&PHPDBG_G(file_sources), filename, strlen(filename));
dataptr = zend_hash_find_ptr(&PHPDBG_G(file_sources), op_array->filename);
ZEND_ASSERT(dataptr != NULL);

dataptr->op_array = *op_array;
Expand Down Expand Up @@ -371,7 +367,6 @@ zend_op_array *phpdbg_compile_string(zval *source_string, char *filename) {
dataptr = erealloc(dataptr, sizeof(phpdbg_file_source) + sizeof(uint) * line);
zend_hash_add_ptr(&PHPDBG_G(file_sources), fake_name, dataptr);

dataptr->filename = estrndup(ZSTR_VAL(fake_name), ZSTR_LEN(fake_name));
zend_string_release(fake_name);

dataptr->op_array = *op_array;
Expand Down
1 change: 0 additions & 1 deletion sapi/phpdbg/phpdbg_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ void phpdbg_init_list(void);
void phpdbg_list_update(void);

typedef struct {
char *filename;
char *buf;
size_t len;
#if HAVE_MMAP
Expand Down
35 changes: 31 additions & 4 deletions sapi/phpdbg/phpdbg_prompt.c
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,7 @@ int phpdbg_compile_stdin(zend_string *code) {
PHPDBG_G(exec_len) = sizeof("Standard input code") - 1;
{ /* remove leading ?> from source */
int i;
/* remove trailing data after zero byte, used for avoiding conflicts in eval()'ed code snippets */
zend_string *source_path = strpprintf(0, "Standard input code%c%p", 0, PHPDBG_G(ops)->opcodes);
phpdbg_file_source *data = zend_hash_find_ptr(&PHPDBG_G(file_sources), source_path);
dtor_func_t dtor = PHPDBG_G(file_sources).pDestructor;
Expand All @@ -549,9 +550,6 @@ int phpdbg_compile_stdin(zend_string *code) {
zend_hash_str_update_ptr(&PHPDBG_G(file_sources), "Standard input code", sizeof("Standard input code")-1, data);
zend_string_release(source_path);

efree(data->filename);
data->filename = estrdup("Standard input code");

for (i = 1; i <= data->lines; i++) {
data->line[i] -= 2;
}
Expand All @@ -568,7 +566,10 @@ int phpdbg_compile(void) /* {{{ */
{
zend_file_handle fh;
char *buf;
char *start_line = NULL;
size_t len;
size_t start_line_len;
int i;

if (!PHPDBG_G(exec)) {
phpdbg_error("inactive", "type=\"nocontext\"", "No execution context");
Expand All @@ -587,14 +588,40 @@ int phpdbg_compile(void) /* {{{ */
}
case '\n':
CG(start_lineno) = 2;
fh.handle.stream.mmap.len -= fh.handle.stream.mmap.buf - buf;
start_line_len = fh.handle.stream.mmap.buf - buf;
start_line = emalloc(start_line_len);
memcpy(start_line, buf, start_line_len);
fh.handle.stream.mmap.len -= start_line_len;
end = fh.handle.stream.mmap.buf;
}
} while (fh.handle.stream.mmap.buf + 1 < end);
}

PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE);

/* prepend shebang line to file_source */
if (start_line) {
phpdbg_file_source *data = zend_hash_find_ptr(&PHPDBG_G(file_sources), PHPDBG_G(ops)->filename);

dtor_func_t dtor = PHPDBG_G(file_sources).pDestructor;
PHPDBG_G(file_sources).pDestructor = NULL;
zend_hash_del(&PHPDBG_G(file_sources), PHPDBG_G(ops)->filename);
PHPDBG_G(file_sources).pDestructor = dtor;

data = erealloc(data, sizeof(phpdbg_file_source) + sizeof(uint) * ++data->lines);
memmove(data->line + 1, data->line, sizeof(uint) * data->lines);
data->line[0] = 0;
data->buf = erealloc(data->buf, data->len + start_line_len);
memmove(data->buf + start_line_len, data->buf, data->len * sizeof(uint));
memcpy(data->buf, start_line, start_line_len);
efree(start_line);
data->len += start_line_len;
for (i = 1; i <= data->lines; i++) {
data->line[i] += start_line_len;
}
zend_hash_update_ptr(&PHPDBG_G(file_sources), PHPDBG_G(ops)->filename, data);
}

fh.handle.stream.mmap.buf = buf;
fh.handle.stream.mmap.len = len;
zend_destroy_file_handle(&fh);
Expand Down
27 changes: 27 additions & 0 deletions sapi/phpdbg/tests/bug73704.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
Bug #73704 (phpdbg shows the wrong line in files with shebang)
--PHPDBG--
list 6
b 4
r
c
q
--EXPECTF--
[Successful compilation of %s]
prompt> 00001: #!/usr/bin/env php
00002: <?php
00003:
00004: echo 1;
00005:
prompt> [Breakpoint #0 added at %s:4]
prompt> [Breakpoint #0 at %s:4, hits: 1]
>00004: echo 1;
00005:
prompt> 1
[Script ended normally]
prompt>
--FILE--
#!/usr/bin/env php
<?php

echo 1;

0 comments on commit 5d7ce72

Please sign in to comment.