diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg_cmd.c')
-rw-r--r-- | sapi/phpdbg/phpdbg_cmd.c | 143 |
1 files changed, 90 insertions, 53 deletions
diff --git a/sapi/phpdbg/phpdbg_cmd.c b/sapi/phpdbg/phpdbg_cmd.c index 36f1a3f4ab..f89e58a13c 100644 --- a/sapi/phpdbg/phpdbg_cmd.c +++ b/sapi/phpdbg/phpdbg_cmd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2015 The PHP Group | + | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ #include "phpdbg_prompt.h" #include "phpdbg_io.h" -ZEND_EXTERN_MODULE_GLOBALS(phpdbg); +ZEND_EXTERN_MODULE_GLOBALS(phpdbg) static inline const char *phpdbg_command_name(const phpdbg_command_t *command, char *buffer) { size_t pos = 0; @@ -95,35 +95,35 @@ PHPDBG_API char* phpdbg_param_tostring(const phpdbg_param_t *param, char **point { switch (param->type) { case STR_PARAM: - asprintf(pointer, "%s", param->str); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s", param->str)); break; case ADDR_PARAM: - asprintf(pointer, ZEND_ULONG_FMT, param->addr); + ZEND_IGNORE_VALUE(asprintf(pointer, ZEND_ULONG_FMT, param->addr)); break; case NUMERIC_PARAM: - asprintf(pointer, "%li", param->num); + ZEND_IGNORE_VALUE(asprintf(pointer, "%li", param->num)); break; case METHOD_PARAM: - asprintf(pointer, "%s::%s", param->method.class, param->method.name); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s::%s", param->method.class, param->method.name)); break; case FILE_PARAM: if (param->num) { - asprintf(pointer, "%s:%lu#%lu", param->file.name, param->file.line, param->num); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s:%lu#%lu", param->file.name, param->file.line, param->num)); } else { - asprintf(pointer, "%s:%lu", param->file.name, param->file.line); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s:%lu", param->file.name, param->file.line)); } break; case NUMERIC_FUNCTION_PARAM: - asprintf(pointer, "%s#%lu", param->str, param->num); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s#%lu", param->str, param->num)); break; case NUMERIC_METHOD_PARAM: - asprintf(pointer, "%s::%s#%lu", param->method.class, param->method.name, param->num); + ZEND_IGNORE_VALUE(asprintf(pointer, "%s::%s#%lu", param->method.class, param->method.name, param->num)); break; default: @@ -325,7 +325,7 @@ PHPDBG_API void phpdbg_param_debug(const phpdbg_param_t *param, const char *msg) if (param && param->type) { switch (param->type) { case STR_PARAM: - fprintf(stderr, "%s STR_PARAM(%s=%lu)\n", msg, param->str, param->len); + fprintf(stderr, "%s STR_PARAM(%s=%zu)\n", msg, param->str, param->len); break; case ADDR_PARAM: @@ -357,11 +357,11 @@ PHPDBG_API void phpdbg_param_debug(const phpdbg_param_t *param, const char *msg) break; case COND_PARAM: - fprintf(stderr, "%s COND_PARAM(%s=%lu)\n", msg, param->str, param->len); + fprintf(stderr, "%s COND_PARAM(%s=%zu)\n", msg, param->str, param->len); break; case OP_PARAM: - fprintf(stderr, "%s OP_PARAM(%s=%lu)\n", msg, param->str, param->len); + fprintf(stderr, "%s OP_PARAM(%s=%zu)\n", msg, param->str, param->len); break; default: { @@ -385,23 +385,31 @@ PHPDBG_API void phpdbg_stack_free(phpdbg_param_t *stack) { switch (remove->type) { case NUMERIC_METHOD_PARAM: case METHOD_PARAM: - if (remove->method.class) - free(remove->method.class); - if (remove->method.name) - free(remove->method.name); + if (remove->method.class) { + efree(remove->method.class); + } + if (remove->method.name) { + efree(remove->method.name); + } break; case NUMERIC_FUNCTION_PARAM: case STR_PARAM: case OP_PARAM: - if (remove->str) - free(remove->str); + case EVAL_PARAM: + case SHELL_PARAM: + case COND_PARAM: + case RUN_PARAM: + if (remove->str) { + efree(remove->str); + } break; case NUMERIC_FILE_PARAM: case FILE_PARAM: - if (remove->file.name) - free(remove->file.name); + if (remove->file.name) { + efree(remove->file.name); + } break; default: { @@ -426,8 +434,9 @@ PHPDBG_API void phpdbg_stack_free(phpdbg_param_t *stack) { PHPDBG_API void phpdbg_stack_push(phpdbg_param_t *stack, phpdbg_param_t *param) { phpdbg_param_t *next = calloc(1, sizeof(phpdbg_param_t)); - if (!next) + if (!next) { return; + } *(next) = *(param); @@ -446,6 +455,16 @@ PHPDBG_API void phpdbg_stack_push(phpdbg_param_t *stack, phpdbg_param_t *param) stack->len++; } /* }}} */ +/* {{{ */ +PHPDBG_API void phpdbg_stack_separate(phpdbg_param_t *param) { + phpdbg_param_t *stack = calloc(1, sizeof(phpdbg_param_t)); + + stack->type = STACK_PARAM; + stack->next = param->next; + param->next = stack; + stack->top = param->top; +} /* }}} */ + PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param_t **stack) { if (command) { char buffer[128] = {0,}; @@ -458,7 +477,7 @@ PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param /* check for arg spec */ if (!(arg) || !(*arg)) { - if (!top) { + if (!top || top->type == STACK_PARAM) { return SUCCESS; } @@ -498,6 +517,10 @@ PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param } while (arg && *arg) { + if (top && top->type == STACK_PARAM) { + break; + } + current++; switch (*arg) { @@ -520,9 +543,11 @@ PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param case '*': { /* do nothing */ } break; } - if (top ) { + if (top) { top = top->next; - } else break; + } else { + break; + } received++; arg++; @@ -636,22 +661,9 @@ PHPDBG_API const phpdbg_command_t *phpdbg_stack_resolve(const phpdbg_command_t * return NULL; } /* }}} */ -/* {{{ */ -PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe) { - phpdbg_param_t *top = NULL; +static int phpdbg_internal_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe) { const phpdbg_command_t *handler = NULL; - - if (stack->type != STACK_PARAM) { - phpdbg_error("command", "type=\"nostack\"", "The passed argument was not a stack !"); - return FAILURE; - } - - if (!stack->len) { - phpdbg_error("command", "type=\"emptystack\"", "The stack contains nothing !"); - return FAILURE; - } - - top = (phpdbg_param_t *) stack->next; + phpdbg_param_t *top = (phpdbg_param_t *) stack->next; switch (top->type) { case EVAL_PARAM: @@ -701,6 +713,32 @@ PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async return SUCCESS; } /* }}} */ +/* {{{ */ +PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe) { + phpdbg_param_t *top = stack; + + if (stack->type != STACK_PARAM) { + phpdbg_error("command", "type=\"nostack\"", "The passed argument was not a stack !"); + return FAILURE; + } + + if (!stack->len) { + phpdbg_error("command", "type=\"emptystack\"", "The stack contains nothing !"); + return FAILURE; + } + + do { + if (top->type == STACK_PARAM) { + int result; + if ((result = phpdbg_internal_stack_execute(top, allow_async_unsafe)) != SUCCESS) { + return result; + } + } + } while ((top = top->next)); + + return SUCCESS; +} /* }}} */ + PHPDBG_API char *phpdbg_read_input(char *buffered) /* {{{ */ { char buf[PHPDBG_MAX_CMD]; @@ -716,8 +754,7 @@ PHPDBG_API char *phpdbg_read_input(char *buffered) /* {{{ */ #define USE_LIB_STAR (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT)) /* note: EOF makes readline write prompt again in local console mode - and ignored if compiled without readline */ #if USE_LIB_STAR -readline: - if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) + if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE) || !isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) #endif { phpdbg_write("prompt", "", "%s", phpdbg_get_prompt()); @@ -727,13 +764,12 @@ readline: else { cmd = readline(phpdbg_get_prompt()); PHPDBG_G(last_was_newline) = 1; - } - if (!cmd) { - goto readline; - } + if (!cmd) { + PHPDBG_G(flags) |= PHPDBG_IS_QUITTING | PHPDBG_IS_DISCONNECTED; + zend_bailout(); + } - if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) { add_history(cmd); } #endif @@ -744,7 +780,7 @@ readline: buffer = estrdup(cmd); #if USE_LIB_STAR - if (!buffered && cmd && !(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) { + if (!buffered && cmd && !(PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && isatty(PHPDBG_G(io)[PHPDBG_STDIN].fd)) { free(cmd); } #endif @@ -762,13 +798,14 @@ readline: if (buffer && strlen(buffer)) { if (PHPDBG_G(buffer)) { - efree(PHPDBG_G(buffer)); + free(PHPDBG_G(buffer)); } - PHPDBG_G(buffer) = estrdup(buffer); - } else { - if (PHPDBG_G(buffer)) { - buffer = estrdup(PHPDBG_G(buffer)); + PHPDBG_G(buffer) = strdup(buffer); + } else if (PHPDBG_G(buffer)) { + if (buffer) { + efree(buffer); } + buffer = estrdup(PHPDBG_G(buffer)); } return buffer; |