Thomas Dickey <[email protected]> writes:
> From: Thomas Dickey <[email protected]>
> Subject: Re: Bug#954220: dialog: program aborts on resize (not fixed by
> 1.3-20190808-1)
> To: Rainer Weikusat <[email protected]>, [email protected]
> Cc: [email protected]
> Date: Fri, 20 Mar 2020 15:46:44 -0400 (7 minutes, 7 seconds ago)
> Reply-To: [email protected]
>
>
> On Wed, Mar 18, 2020 at 07:31:35PM +0000, Rainer Weikusat wrote:
>> Package: dialog
>> Version: 1.3-20190211-1
>> Severity: normal
>> Tags: patch
>>
>> As originally reported in #930775, the dialog program aborts with an exit
>> status of
>> 255 after resizing a widget. This is due to the dlg_win_resize function
>> (util.c)
>> configuring an input timeout of 0.02s which is then left in place, causing
>> the next
>> regular character read (via dlg_getc in ui_getc.c) to fail with a timeout
>> the code
>> isn't prepared to handle. The orignal command for triggering this was
>>
>> dialog --msgbox Text 0 0
>>
>> Supposedly, this issue is fixed in 1.3-20190808-1 but this isn't the case:
>> The relevant
>> change in there ignores getc errors after a resize until some key event is
>> received.
>
> I'm not seeing this behavior. In 20190724, I added
>
> wtimeout(win, 0);
>
> which conflicts with the suggested patch and leaves the input in nonblocking
> (rather than blocking) input.
Which is the exact problem: It means that the next input read will
immediately return with a timeout.
> 2019/07/24
> + modify dlg_will_resize() and dlg_result_key() functions to reduce
> the chance that dialog exits on a SIGWINCH (Debian #930775).
>
>> Because of this, the bug can no longer be triggered via msgbox as the only
>> key event
>> processed by that cause the program to exit. It's still possible to trigger
>> the issue
>> by using
>>
>> dialog --yesno Ohno 0 0
>>
>> resizing the window and then pressing <tab> to switch from the yes- to the
>> no-button.
>
> If I resize the window, the dialog doesn't exit by itself.
> Pressing either enter or space gives an exit-code 1 (which is
> expected).
I've just tested this with the most recent version: The behaviour is
exactly as described above:
Run
dialog --yesno Text 0 0
resize window, press <tab> (or any other non-terminal key, eg, 'a') =>
program exits with an exit code of 255 (aka -1) [*].
Replacing the
wtimeout(win, 0)
with
wtimeout(win, -1)
thus restoring blocking input, causes the issue to go away.
[*] This happens because the
if (dialog_state.had_resize) {
if (dialog_key == ERR) {
dialog_key = 0;
} else {
dialog_state.had_resize = FALSE;
}
} else if (fkey && dialog_key == KEY_RESIZE) {
dialog_state.had_resize = TRUE;
}
in dlg_result_key suppresses all errors until a non-resize event is seen
(eg, switching buttons with <tab>). As input is still nonblocking, the
next dlg_getc will very likely (if no other input is already available)
immediately return an error because of the timeout.