This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [Bug-readline] heap-buffer-overflow in update_line
- From: Tom de Vries <tdevries at suse dot de>
- To: chet dot ramey at case dot edu, bug-readline at gnu dot org
- Cc: gdb-patches at sourceware dot org, Pedro Alves <palves at redhat dot com>
- Date: Thu, 23 May 2019 09:33:10 +0200
- Subject: Re: [Bug-readline] heap-buffer-overflow in update_line
- References: <52f237e9-83e8-2a97-4766-e60b867ab914@suse.de> <d29fbf1f-d33e-77f6-90ed-0eb3779a027c@case.edu> <79173bd4-f37e-c137-cf48-187047078bf0@suse.de> <fd2c9f0b-9737-6dad-a444-6e194afa6af9@case.edu>
On 20-05-19 22:14, Chet Ramey wrote:
> On 5/17/19 10:59 AM, Tom de Vries wrote:
>
>> Either way, I'm open for suggestions that make gdb call
>> rl_set_screen_size with legal parameters, and disable features like
>> horizontal scrolling to get unformatted output for the testsuite run.
>
> Here's a patch that will prevent the huge values for the screen width from
> causing at least one issue with line_size:
>
> *** ../readline-8.0-patched/display.c 2018-09-30 21:37:48.000000000 -0400
> --- display.c 2019-05-16 16:50:44.000000000 -0400
> ***************
> *** 604,607 ****
> --- 604,610 ----
> register int n;
>
> + if (line_size <= _rl_screenwidth) /* XXX - for gdb */
> + line_size = _rl_screenwidth + 1;
> +
> if (invisible_line == 0) /* initialize it */
> {
>
> You're still going to have to deal with some horizontal scrolling if the
> input line gets long enough.
>
Hi Chet,
thanks for the patch.
I've tried it out (together with the assert mentioned earlier) and found
that indeed it fixes the assert for the reported scenario:
...
$ TERM=dumb ./gdb -q -ex "set width 0"
(gdb)
...
but I still ran into the assert by typing the command instead of using
"-ex":
...
$ TERM=dumb ./gdb -q
(gdb) set width 0
gdb: display.c:1214: rl_redisplay: Assertion `last_lmargin +
(_rl_screenwidth + visible_wrap_offset) <= line_size' failed.
Aborted (core dumped)
...
Using this additional bit:
...
@@ -528,6 +533,8 @@ rl_redisplay ()
init_line_structures (0);
rl_on_new_line ();
}
+ else if (line_size <= _rl_screenwidth)
+ init_line_structures (_rl_screenwidth + 1);
/* Draw the line into the buffer. */
cpos_buffer_position = -1;
...
I managed to fix the assert also in this scenario, and managed to run
the entire gdb testsuite without triggering the assert.
Is that a good code change?
Thanks,
- Tom