From d15c8ab103f50a76677a2938f3f5ebbf7daac4da Mon Sep 17 00:00:00 2001 From: Weilin Du Date: Sun, 8 Nov 2026 00:19:59 +0800 Subject: [PATCH] ext/readline: Fix non-ASCII pending input in readline_info() --- NEWS | 4 +++ ext/readline/readline.c | 2 +- .../tests/readline_info_pending_input.phpt | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 ext/readline/tests/readline_info_pending_input.phpt diff --git a/NEWS b/NEWS index 28e8b7a18889..ef28f25882db 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,10 @@ PHP NEWS or never terminates). (Ilia Alshanetsky) . Fixed memory leak in JIT ASSIGN_DIM when the assignment fails. (Jorg Sowa) +- Readline: + . Fixed incorrect handling of non-ASCII pending_input bytes in readline_info(), + which could cause readline() to return false prematurely. (Weilin Du) + - Streams: . Fixed bug GH-22063 (Stream filter chain UAF on self-removal during callback). (Ilia Alshanetsky) diff --git a/ext/readline/readline.c b/ext/readline/readline.c index f9287af2eff6..cb1a6d948ad8 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -229,7 +229,7 @@ PHP_FUNCTION(readline_info) if (!try_convert_to_string(value)) { RETURN_THROWS(); } - rl_pending_input = Z_STRVAL_P(value)[0]; + rl_pending_input = (unsigned char)Z_STRVAL_P(value)[0]; } RETVAL_LONG(oldval); } else if (zend_string_equals_literal_ci(what, "prompt")) { diff --git a/ext/readline/tests/readline_info_pending_input.phpt b/ext/readline/tests/readline_info_pending_input.phpt new file mode 100644 index 000000000000..dd16bd0d5527 --- /dev/null +++ b/ext/readline/tests/readline_info_pending_input.phpt @@ -0,0 +1,28 @@ +--TEST-- +readline_info(): pending_input supports non-ASCII bytes +--EXTENSIONS-- +readline +--SKIPIF-- + +--FILE-- + +--EXPECT-- +old=0 current=127 info=127 +old=127 current=128 info=128 +old=128 current=254 info=254 +old=254 current=255 info=255 +old=255 current=0 info=0