From 04407b79dfa41a38a6bce3823b3f80eab9ce3ae8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 11 Dec 2015 16:32:10 +0100 Subject: [PATCH] Fixed bug #71094 I didn't see any non-dummy readline tests to work off, so this change is tested manually only. While at it also fix other zval_dtors and use ZVAL_COPY. --- NEWS | 4 ++++ ext/readline/readline.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 89c5fa87ab..6f2b4b2701 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,10 @@ PHP NEWS . Fixed bug #71066 (mb_send_mail: Program terminated with signal SIGSEGV, Segmentation fault). (Laruence) +- Readline: + . Fixed bug #71094 (readline_completion_function corrupts static array on + second TAB). (Nikita) + - SPL: . Fixed bug #71077 (ReflectionMethod for ArrayObject constructor returns wrong number of parameters). (Laruence) diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 47e59d8363..5aca0518db 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -188,7 +188,7 @@ PHP_MSHUTDOWN_FUNCTION(readline) PHP_RSHUTDOWN_FUNCTION(readline) { - zval_dtor(&_readline_completion); + zval_ptr_dtor(&_readline_completion); ZVAL_UNDEF(&_readline_completion); #if HAVE_RL_CALLBACK_READ_CHAR if (Z_TYPE(_prepped_callback) != IS_UNDEF) { @@ -505,7 +505,7 @@ static char **_readline_completion_cb(const char *text, int start, int end) for (i = 0; i < 3; i++) { zval_ptr_dtor(¶ms[i]); } - zval_dtor(&_readline_array); + zval_ptr_dtor(&_readline_array); return matches; } @@ -526,8 +526,8 @@ PHP_FUNCTION(readline_completion_function) } zend_string_release(name); - zval_dtor(&_readline_completion); - ZVAL_DUP(&_readline_completion, arg); + zval_ptr_dtor(&_readline_completion); + ZVAL_COPY(&_readline_completion, arg); rl_attempted_completion_function = _readline_completion_cb; if (rl_attempted_completion_function == NULL) { @@ -552,7 +552,7 @@ static void php_rl_callback_handler(char *the_line) call_user_function(CG(function_table), NULL, &_prepped_callback, &dummy, 1, params); zval_ptr_dtor(¶ms[0]); - zval_dtor(&dummy); + zval_ptr_dtor(&dummy); } /* {{{ proto void readline_callback_handler_install(string prompt, mixed callback) @@ -577,10 +577,10 @@ PHP_FUNCTION(readline_callback_handler_install) if (Z_TYPE(_prepped_callback) != IS_UNDEF) { rl_callback_handler_remove(); - zval_dtor(&_prepped_callback); + zval_ptr_dtor(&_prepped_callback); } - ZVAL_DUP(&_prepped_callback, callback); + ZVAL_COPY(&_prepped_callback, callback); rl_callback_handler_install(prompt, php_rl_callback_handler); @@ -604,7 +604,7 @@ PHP_FUNCTION(readline_callback_handler_remove) { if (Z_TYPE(_prepped_callback) != IS_UNDEF) { rl_callback_handler_remove(); - zval_dtor(&_prepped_callback); + zval_ptr_dtor(&_prepped_callback); ZVAL_UNDEF(&_prepped_callback); RETURN_TRUE; } -- 2.50.1