From 341468055759c4cd0247b460536d25a44a11551b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:24:13 -0200 Subject: [PATCH 1/2] - Improved phpdbg_set_breakpoint_file function --- phpdbg_bp.c | 20 +++++--------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 7114ff0530c..5229a0b7b55 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -39,36 +39,26 @@ static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ efree((char*)bp->symbol); } /* }}} */ -void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { - char resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); phpdbg_breakfile_t new_break; zend_llist *break_files_ptr; - size_t name_len; - char *path = estrndup(expr, line_pos - expr); + size_t path_len = strlen(path); - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - efree(path); - return; - } - efree(path); - - name_len = strlen(resolved_name); - new_break.filename = estrndup(resolved_name, name_len + 1); + new_break.filename = estrndup(path, path_len + 1); new_break.line = line_num; PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), - new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { + new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); zend_hash_update(&PHPDBG_G(bp_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), + new_break.filename, path_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 38b9c6174c6..49035be550c 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -38,7 +38,7 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; -void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fc559dd2df5..5e3b968b9f2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -213,7 +213,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { - phpdbg_set_breakpoint_file(expr, line_pos TSRMLS_CC); + char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + return FAILURE; + } + + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); From fb4f94c52c81fc7be5b16d814c362de310deff38 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:30:24 -0200 Subject: [PATCH 2/2] - Improved phpdbg_set_breakpoint_symbol function --- phpdbg_bp.c | 7 +++---- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 5229a0b7b55..9085533c0ca 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -66,14 +66,13 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ -void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */ { - long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; phpdbg_breaksymbol_t new_break; zend_llist *break_sym_ptr; - size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + size_t name_len = strlen(name); - new_break.symbol = estrndup(expr, name_len); + new_break.symbol = estrndup(name, name_len + 1); new_break.opline_num = opline_num; PHPDBG_G(has_sym_bp) = 1; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 49035be550c..45f4239eafd 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -39,7 +39,7 @@ typedef struct _phpdbg_breaksymbol_t { } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); -void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5e3b968b9f2..8591d02945a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -225,9 +225,15 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); + char name[200]; + const char *opnum_pos = zend_memrchr(expr, '#', expr_len); + long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0; + size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr); - phpdbg_set_breakpoint_symbol(expr, opline_num_pos TSRMLS_CC); + memcpy(name, expr, name_len); + name[name_len] = 0; + + phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC); } return SUCCESS;