Skip to content

Commit 3ab4ff7

Browse files
committed
ext/readline: readline_info fix usage when the buffer is not initialised
rl_initialise is only called when readline() is used so the global buffer might not be initialised yet.
1 parent a7d856d commit 3ab4ff7

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

Diff for: ext/readline/readline.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,10 @@ PHP_FUNCTION(readline_info)
187187
RETURN_THROWS();
188188
}
189189
#ifndef PHP_WIN32
190-
if (strlen(oldstr) < Z_STRLEN_P(value)) {
190+
if (!oldstr || strlen(oldstr) < Z_STRLEN_P(value)) {
191191
rl_extend_line_buffer(Z_STRLEN_P(value) + 1);
192+
} else if (!rl_line_buffer) {
193+
rl_line_buffer = malloc(Z_STRLEN_P(value) + 1);
192194
}
193195
memcpy(rl_line_buffer, Z_STRVAL_P(value), Z_STRLEN_P(value) + 1);
194196
rl_end = Z_STRLEN_P(value);

Diff for: ext/readline/tests/readline_info_002.phpt

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
readline_info(): using line_buffer before rl_line_buffer is initialised.
3+
--EXTENSIONS--
4+
readline
5+
--SKIPIF--
6+
<?php if (READLINE_LIB == "libedit") die("skip readline only");
7+
if (getenv('SKIP_REPEAT')) die("skip readline has global state");
8+
?>
9+
--FILE--
10+
<?php
11+
12+
$name = tempnam('/tmp', 'readline.tmp');
13+
14+
var_dump(readline_info('line_buffer'));
15+
readline_info('line_buffer', 'abcdef');
16+
var_dump(readline_info('line_buffer'));
17+
readline_add_history('123');
18+
readline_write_history($name);
19+
readline_info('line_buffer', 'abcdefghijkl');
20+
var_dump(readline_info('line_buffer'));
21+
22+
var_dump(file_get_contents($name));
23+
24+
unlink($name);
25+
?>
26+
--EXPECTF--
27+
string(0) ""
28+
string(6) "abcdef"
29+
string(12) "abcdefghijkl"
30+
string(4) "123
31+
"

0 commit comments

Comments
 (0)