From 4335e316e2551dada7683683d7d529edd94228df Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 27 Jul 2024 09:30:11 +0100 Subject: [PATCH 1/2] ext/readline: fix global readline vars when updating rl_line_buffer. if the new value was larger, rl_line_buffer_length was never updated. neither was rl_end (on unixes). --- ext/readline/readline.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ext/readline/readline.c b/ext/readline/readline.c index fc36114745752..f800304999856 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -183,11 +183,18 @@ PHP_FUNCTION(readline_info) if (zend_string_equals_literal_ci(what,"line_buffer")) { oldstr = rl_line_buffer; if (value) { - /* XXX if (rl_line_buffer) free(rl_line_buffer); */ if (!try_convert_to_string(value)) { RETURN_THROWS(); } +#ifndef PHP_WIN32 + if (strlen(oldstr) < Z_STRLEN_P(value)) { + rl_extend_line_buffer(Z_STRLEN_P(value) + 1); + } + strcpy(rl_line_buffer, Z_STRVAL_P(value)); + rl_end = Z_STRLEN_P(value); +#else rl_line_buffer = strdup(Z_STRVAL_P(value)); +#endif } RETVAL_STRING(SAFE_STRING(oldstr)); } else if (zend_string_equals_literal_ci(what, "point")) { From f4726210d5308a74008eddf23aa04784a7b8ba01 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 27 Jul 2024 10:36:32 +0100 Subject: [PATCH 2/2] mem leak for windows ? --- ext/readline/readline.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ext/readline/readline.c b/ext/readline/readline.c index f800304999856..eca64f45b1586 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -190,10 +190,16 @@ PHP_FUNCTION(readline_info) if (strlen(oldstr) < Z_STRLEN_P(value)) { rl_extend_line_buffer(Z_STRLEN_P(value) + 1); } - strcpy(rl_line_buffer, Z_STRVAL_P(value)); + memcpy(rl_line_buffer, Z_STRVAL_P(value), Z_STRLEN_P(value) + 1); rl_end = Z_STRLEN_P(value); #else - rl_line_buffer = strdup(Z_STRVAL_P(value)); + char *tmp = strdup(Z_STRVAL_P(value)); + if (tmp) { + if (rl_line_buffer) { + free(rl_line_buffer); + } + rl_line_buffer = tmp; + } #endif } RETVAL_STRING(SAFE_STRING(oldstr));