diff --git a/ext/readline/readline.c b/ext/readline/readline.c index eca64f45b1586..bc3067f3a6545 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -186,12 +186,14 @@ PHP_FUNCTION(readline_info) if (!try_convert_to_string(value)) { RETURN_THROWS(); } -#ifndef PHP_WIN32 - if (strlen(oldstr) < Z_STRLEN_P(value)) { +#if !defined(PHP_WIN32) && !HAVE_LIBEDIT + if (!rl_line_buffer) { + rl_line_buffer = malloc(Z_STRLEN_P(value) + 1); + } else if (strlen(oldstr) < Z_STRLEN_P(value)) { rl_extend_line_buffer(Z_STRLEN_P(value) + 1); + oldstr = rl_line_buffer; } memcpy(rl_line_buffer, Z_STRVAL_P(value), Z_STRLEN_P(value) + 1); - rl_end = Z_STRLEN_P(value); #else char *tmp = strdup(Z_STRVAL_P(value)); if (tmp) { @@ -200,6 +202,9 @@ PHP_FUNCTION(readline_info) } rl_line_buffer = tmp; } +#endif +#if !defined(PHP_WIN32) + rl_end = Z_STRLEN_P(value); #endif } RETVAL_STRING(SAFE_STRING(oldstr)); diff --git a/ext/readline/tests/readline_info_002.phpt b/ext/readline/tests/readline_info_002.phpt new file mode 100644 index 0000000000000..35fb6cd7b1de7 --- /dev/null +++ b/ext/readline/tests/readline_info_002.phpt @@ -0,0 +1,31 @@ +--TEST-- +readline_info(): using line_buffer before rl_line_buffer is initialised. +--EXTENSIONS-- +readline +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +string(0) "" +string(6) "abcdef" +string(12) "abcdefghijkl" +string(4) "123 +"