On Thu, Dec 25, 2025 at 08:01:25PM -0800, Mike Castle wrote:
> While not documented, if a form-field is given a negative input-lenght
> (ilen), dialog will start up.
> 
> But, when combined with a "--max-input 5", it will crash after a
> while.  I suspect it would also crash with the default 2048, but I got
> tired of trying to reproduce.
> 
> 
> $ dialog --version
> Version: 1.3-20250817
> 
> $ dialog --no-mouse --trace trace.txt --max-input 5 --title 'Form
> title' --form 'Form text' 0 0 0 'Form label:' 1 1 'Item' 2 2 15 -1
> 'Label 2:' 3 1 'Another item' 4 2 15 -1

thanks (I can see something to fix)
 
> 
>                         ┌────────Form title──────────┐
>                         │ Form text                  │
>                         │ ┌────────────────────────┐ │
>                         │ │Form label:             │ │
>                         │ │ iiiiijjjjjjjjSegmentation fault
> (core dumped) dialog --no-mouse --trace trace.txt --max-input 5
> --title 'Form title' --form 'Form text' 0 0 0 'Form label:' 1 1 'Item'
> 2 2 15 -1 'Label 2:' 3 1 'Another item' 4 2 15 -1            │
> └────────────────────────┘ │
> nexus@vradic[19:28]~(629442) j───────────────────────┤
>                         │   <  OK  >  <Cancel>       │
>                         └────────────────────────────┘
> 
> # I had to use --no-mouse so that, after the crash, the terminal would
> let me copy and paste.  But the result is the same without it.
> 
> $ cat trace.txt
> ## opened at Thu Dec 25 19:28:02 2025
> ## dialog 1.3-20250817
> ## vile: confmode
> # Parameters:
> #    argv[0] = dialog
> #    argv[1] = --no-mouse
> #    argv[2] = --trace
> #    argv[3] = trace.txt
> #    argv[4] = --max-input
> #    argv[5] = 5
> #    argv[6] = --title
> #    argv[7] = Form title
> #    argv[8] = --form
> #    argv[9] = Form text
> #    argv[10] = 0
> #    argv[11] = 0
> #    argv[12] = 0
> #    argv[13] = Form label:
> #    argv[14] = 1
> #    argv[15] = 1
> #    argv[16] = Item
> #    argv[17] = 2
> #    argv[18] = 2
> #    argv[19] = 15
> #    argv[20] = -1
> #    argv[21] = Label 2:
> #    argv[22] = 3
> #    argv[23] = 1
> #    argv[24] = Another item
> #    argv[25] = 4
> #    argv[26] = 2
> #    argv[27] = 15
> #    argv[28] = -1
> #    argv[4] = --max-input
> #    .. set dialog_vars.max-input = 5
> #    argv[6] = --title
> #    .. set dialog_vars.title = Form title
> #    argv[8] = --form
> # init_result
> # process_common_options, offset 1:29
> #    argv[1] = --no-mouse
> #    .. set dialog_state.no-mouse = TRUE
> #    argv[2] = --trace
> # ignore extra --trace option
> # Parameters:
> #    argv[0] = dialog
> #    argv[1] = --no-mouse
> #    argv[2] = --trace
> #    argv[3] = trace.txt
> #    argv[4] = --max-input
> #    argv[5] = 5
> #    argv[6] = --title
> #    argv[7] = Form title
> #    argv[8] = --form
> #    argv[9] = Form text
> #    argv[10] = 0
> #    argv[11] = 0
> #    argv[12] = 0
> #    argv[13] = Form label:
> #    argv[14] = 1
> #    argv[15] = 1
> #    argv[16] = Item
> #    argv[17] = 2
> #    argv[18] = 2
> #    argv[19] = 15
> #    argv[20] = -1
> #    argv[21] = Label 2:
> #    argv[22] = 3
> #    argv[23] = 1
> #    argv[24] = Another item
> #    argv[25] = 4
> #    argv[26] = 2
> #    argv[27] = 15
> #    argv[28] = -1
> #    argv[4] = --max-input
> #    .. set dialog_vars.max-input = 5
> #    argv[6] = --title
> #    .. set dialog_vars.title = Form title
> #    argv[8] = --form
> # execute --form
> # form args:
> #         title = Form title
> #       message = Form text
> #        height = 0
> #         width = 0
> #       lheight = 0
> #       llength = 2
> #       current = 0
> # dlg_auto_size(0,0) limits 4,26
> # ...dlg_auto_size(7,30) also 1,11
> # dlg_register_window formbox
> # key bindings for formbox widgets
> bindkey formbox ^E HELPFILE
> bindkey formbox F1 HELPFILE
> bindkey formbox HELP HELPFILE
> bindkey formbox ^J ENTER
> bindkey formbox ^M ENTER
> bindkey formbox ENTER ENTER
> bindkey formbox ^D LEAVE
> bindkey formbox ^I FIELD_NEXT
> bindkey formbox BTAB FIELD_PREV
> bindkey formbox ^N ITEM_NEXT
> bindkey formbox DOWN ITEM_NEXT
> bindkey formbox RIGHT ITEM_NEXT
> bindkey formbox NEXT ITEM_NEXT
> bindkey formbox ^P ITEM_PREV
> bindkey formbox PREVIOUS ITEM_PREV
> bindkey formbox LEFT ITEM_PREV
> bindkey formbox UP ITEM_PREV
> bindkey formbox NPAGE PAGE_NEXT
> bindkey formbox PPAGE PAGE_PREV
> bindkey formbox \s TOGGLE
> # ...done dlg_register_window formbox
> # dlg_register_window formfield
> # key bindings for formfield widgets
> bindkey formfield HOME BEGIN
> bindkey formfield ^U DELETE_ALL
> bindkey formfield ^? DELETE_LEFT
> bindkey formfield BACKSPACE DELETE_LEFT
> bindkey formfield ^H DELETE_RIGHT
> bindkey formfield DC DELETE_RIGHT
> bindkey formfield END FINAL
> bindkey formfield LEFT GRID_LEFT
> bindkey formfield RIGHT GRID_RIGHT
> bindkey formfield ^E HELPFILE
> bindkey formfield F1 HELPFILE
> bindkey formfield HELP HELPFILE
> bindkey formfield ^J ENTER
> bindkey formfield ^M ENTER
> bindkey formfield ENTER ENTER
> bindkey formfield ^D LEAVE
> bindkey formfield ^I FIELD_NEXT
> bindkey formfield BTAB FIELD_PREV
> bindkey formfield ^N ITEM_NEXT
> bindkey formfield DOWN ITEM_NEXT
> bindkey formfield RIGHT ITEM_NEXT    # overridden by GRID_RIGHT
> bindkey formfield NEXT ITEM_NEXT
> bindkey formfield ^P ITEM_PREV
> bindkey formfield PREVIOUS ITEM_PREV
> bindkey formfield LEFT ITEM_PREV    # overridden by GRID_LEFT
> bindkey formfield UP ITEM_PREV
> bindkey formfield NPAGE PAGE_NEXT
> bindkey formfield PPAGE PAGE_PREV
> # ...done dlg_register_window formfield
> # mouse_mkregion 3,3 4x24 0 (-1279)
> # mouse_mkregion 2,7 1x6 0 (339)
> # mouse_mkregion 7,7 1x6 0 (338)
> # mouse_mkregion 9,4 1x6 0 (0)
> # mouse_mkregion 9,14 1x6 0 (1)
> window 11x30 at 6,24
>   0:+--------Form title----------+
>   1:| Form text                  |
>   2:| +------------------------+ |
>   3:| |Form label:             | |
>   4:| | Item                   | |
>   5:| |Label 2:                | |
>   6:| | Another item           | |
>   7:| +------------------------+ |
>   8:+----------------------------+
>   9:|   <  OK  >  <Cancel>       |
>  10:+----------------------------+
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr a (ch=0x61, fkey=0)
> # dlg_result_key(dialog_key=97, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr b (ch=0x62, fkey=0)
> # dlg_result_key(dialog_key=98, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr c (ch=0x63, fkey=0)
> # dlg_result_key(dialog_key=99, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr d (ch=0x64, fkey=0)
> # dlg_result_key(dialog_key=100, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr e (ch=0x65, fkey=0)
> # dlg_result_key(dialog_key=101, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr f (ch=0x66, fkey=0)
> # dlg_result_key(dialog_key=102, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr g (ch=0x67, fkey=0)
> # dlg_result_key(dialog_key=103, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr h (ch=0x68, fkey=0)
> # dlg_result_key(dialog_key=104, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr i (ch=0x69, fkey=0)
> # dlg_result_key(dialog_key=105, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> chr j (ch=0x6a, fkey=0)
> # dlg_result_key(dialog_key=106, fkey=0)
> 
> 
> 
> I was looking for a way to have "unlimited" input length with a form,
> like one might see with --inputbox or --inputmenu.
> 
> Bonus bug!
> 
> Just discovered this while typing this up:
> 
> If ilen is set to a value greater than --max-input, a segfault can
> also be triggered.
> 
> I am guessing that, in both cases, it might make sense to either bail
> out on incompatible flags, or at least, when overriding
> dialog_vars.max_input, make it the min() of the dialog_vars.max_input
> or current->text_ilen.
> 
> mrc
> 
> 

-- 
Thomas E. Dickey <[email protected]>
https://invisible-island.net

Attachment: signature.asc
Description: PGP signature

Reply via email to