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


                        ┌────────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

Reply via email to